Introduction
From early in life, attributions of mental states shape our social interactions and inform our judgments of moral status. In order to predict and explain others’ behavior, we make inferences about what they perceive, believe, and desire. In our social relationships, we help friends with their goals, think through problems together, delight in each other’s happiness, seek comfort from each other in times of sadness, and (for the most part) do our best to avoid causing our loved ones emotional or physical pain. Beyond this, attributions of mental capacities to non-human animals, supernatural beings, technologies, and other entities help us understand the boundaries of our social worlds, shaping our perspectives on animal rights (Do cows feel pain, fear, or love?), guiding our spiritual and religious lives (Is God listening to my prayers? What do my ancestors need and want from me?), and helping us decide how to interact with “artificial intelligences” (Is it cruel to insult a virtual personal assistant? Who or what is to blame when an autonomous vehicle causes an accident?). From this perspective, representations of mental life are at the core of human social reasoning and experience.
But “mental life” is complex. On the one hand, capacities for perception, belief, desire, goals, thoughts, emotions, physiological sensations, and other mental states have some things in common. For example, in the Western world we commonly consider all of these mental states to occur inside a person’s mind; and although these mental states might guide that person’s observable behaviors (e.g., facial expressions, words, and actions), none of these mental states is directly observable to anyone else. On the other hand, different kinds of mental states differ in important ways. To give just a few examples: Some mental states are closely related to specific bodily organs (e.g., we see things with our eyes, we feel hunger in our stomach), and others less obviously so (where do we experience “belief”?). Some are positively or negatively valenced (e.g., pain feels bad, happiness feels good), and others are more neutral, or vary depending on the circumstance (e.g., beliefs, thoughts). Some mental states involve taking in information about the environment (e.g., hearing a noise), while others involve storing or updating that information (e.g., remembering, learning), or using it to bring about changes in the external world (e.g., planning, making choices). Furthermore, we might assume that certain entities in the world have all of the many kinds of experiences and mental capacities that we do ourselves (e.g., other humans, perhaps some other mammals), while believing that others have a more limited set (e.g., we might think a beetle could never reason about philosophy, or do complex computations; or that a robot is incapable of feeling embarrassed, or guilty).
From antiquity through the present day, scholars and spiritual leaders have speculated about how to make sense of these commonalities and differences—in other words, about the nature and structure of what we will refer to in this paper as “mental life.” Plato and Aristotle each proposed that people are composed of three components (for Plato, the appetite, the spirit, and reason; for Aristotle, the intellectual, perceptual, and nutritive parts of the soul); the Buddha instead spoke of people and other sentient beings as five-part aggregations (combinations of material form, sensations, perceptions, volitions or “mental formations,” and consciousness). In the twentieth century, some social and cognitive scientists turned away from the metaphyiscal question (What is the mind?) and toward a psychological question: How do ordinary people represent the mind? For example, the anthropologist and cognitive scientist Roy D’Andrade (1987) proposed a “folk model of the mind” composed of six categories (perceptions; beliefs and knowledge; feelings and emotions; desires and wishes; intentions; and resolution, will, and self-control; for alternative formulations of folk models of mind arising from a variety of cultural contexts, see Heelas & Lock, 1981; Lillard, 1998; Luhrmann et al., 2011).
Psychologists investigating children’s representations of mental life have made reference to categories like “visual perception,” “attention,” “desires,” “emotions,” “intentions,” “beliefs and related mental representations,” “knowledge,” “pretense,” and “thinking,” to quote the section headings in John Flavell’s (1999) seminal review of children’s reasoning about the mind. In recent decades the field has made great progress in understanding how children make sense of other people’s minds by postulating distinct representations of others’ perceptions, beliefs, desires, and emotions, and exploring how children come to build and coordinate these representations (see Wellman, 2017, for review).
Such categories have been incredibly useful in these explorations of children’s social cognitive development—but do they correspond to children’s own understanding of the structure of mental life? How do children conceive of the connections and distinctions among mental states, and how does this conceptual structure shape their understanding of the various humans, animals, technologies, and other “beings” in the world around them?
In the current paper, we set out to derive this conceptual structure empirically, using an approach—exploratory factor analysis—that reveals the conceptual connections and distinctions underlying participants’ responses from the bottom up, without reference to a pre-specified hypothesis or theory. From our perspective, this approach has two major advantages. First, it can reveal conceptual structure without requiring participants to articulate it themselves. Second, the conceptual structure revealed by this approach can, in principle, differ dramatically from the assumptions of a research team. These are especialaly compelling advantages in the domain of conceptual development—in which, by definition, participants struggle to introspect and articulate their reasoning, and findings often conflict with adult intuitions.
To our knowledge, there have been only a few attempts to do something similar in the past. In particular, in a series of studies with 8- to 11-year-old children, Fabricius, Schwanenflugel, and colleagues explored one corner of this conceptual space, focusing on how children come distinguish among different “ways of knowing.” In their initial study, 8- and 10-year-old children and adults rated the similarity of pairs of sentences that involved either memory, comprehension, attention, or inference; their results suggested that children gradually come to make distinctions among these four aspects of knowing over the course of middle to late childhood, first distinguishing between more “conceptual” vs. “perceptual” aspects of knowing, and later coming to differentiate among ways of knowing according to how much they rely on “memory,” with development extending perhaps into adolescence (Fabricius, Schwanenflugel, Kyllonen, Barclay, & Denton, 1989; Schwanenflugel, Fabricius, & Noyes, 1996; Schwanenflugel, Fabricius, Noyes, & Bigler, 1994).
There has been slightly more exploration of how adults conceptualize mental life. Rips and Conrad (1989), for example, conducted in-depth analyses of folk taxonomies of mental life by asking adults questions about which mental activities and mental states are “parts” or “kinds” of each other (e.g., “Is planning a kind of reasoning?”); and Malle and Knobe (1997) explored the “folk concept of intentionality” by eliciting and coding participants’ open-ended definitions of the term “intentional.” One especially exciting approach was pioneered by Gray, Gray, and Wegner (2007) in their work on how adults perceive different kinds of social beings. From participants’ responses to questions about the mental capacities of various characters (e.g., “Which is more capable of experiencing joy: a green frog or a 5-month-old infant?”), the authors were able to extract a conceptual space of characters, characterized by two dimensions: “experience,” the extent to which a character is capable of hunger, fear, pride, and other inner experiences; and “agency,” the extent to which a character is capable of self-control, morality, memory, and other capacities central to acting in the world.
Gray et al.’s (2007) approach is particularly compelling to us as developmental psychologists because of its simplicity. Participants in their study answered a series of relatively straightforward, concrete questions, which drew on their intuitions about familiar entities in the world (e.g., frogs, infants). Such questions are likely easier, quicker, and more enjoyable for participants (especially children) than the demanding metacognitive tasks that previous studies have employed (e.g., deciding how similar two sentences are “based on the ways you use your mind in each one”; Fabricius et al., 1989, p. 1281). However, Gray et al.’s (2007) study focused participants’ attention on the similarities and differences between characters, by asking individual participants to compare many pairs of characters (e.g., a frog vs. an infant, a dog vs. a robot) on a single mental capacity (e.g., joy for some participants, and self-control for others). In our view, this design is well-suited to reveal the dimensions along which social beings are thought to differ from each other—an important part of social reasoning, but not equivalent to intuitions about the structure of mental life itself.
Inspired by their approach, we recently conducted a series of studies designed to assess this structure directly [XX add PNAS citation]. We focused adults’ attention on the connections and divisions between different aspects of mental life by asking them to evaluate a wide variety of mental capacities for a single character (e.g., a robot or a beetle). By analyzing patterns of attributions across participants, we uncovered a three-part conceptual structure that emerged consistently across several studies: Physiological sensations and self-initiated behaviors hung together to form a suite of capacities related to the body; social-emotional experiences and moral agency formed a suite of capacities related to the heart; and perceptual-cognitive abilities and goal pursuit formed a suite of capacities related to the mind. Interestingly, each of these three factors encompassed aspects of both “experience” and “agency.” Instead of the broad distinction that seems to characterize adults’ understanding of the similarities and differences among social beings (Gray et al., 2007), adults’ understanding of the structure of mental life itself seems to hinge on distinctions among varieties of experience and agency, and connections among related kinds of experience and agency. This body–heart–mind framework emerged robustly in four studies with US adults, including studies that asked participants to evaluate the mental capacities of one of two “edge cases” in social reasoning (a beetle or a robot) and studies that included a wider variety of target characters, from inert objects, to humans, animals, and various technologies.
Here, we set out to adapt the bottom-up approach developed in our previous work with adults [XX add PNAS citation] to explore intuitions about the structure of mental life among children. We included a wide variety of mental capacities representing all aspects of mental life—from perception and cognition, to social experiences, emotions and physiological sensations—allowing us to move beyond the more focused explorations of cognitive abilities in particular (Fabricius et al., 1989) to a fuller account of children’s conceptual representations of mental life.
In this paper, we first introduce a child-friendly version of Weisman et al.’s (2017) experimental paradigm, validate it among US adults, and then use this paradigm to conduct an initial exploration of this conceptual structure and mental capacity attributions among US children, focusing on 7- to 9-year-old children (Study 1). Next, we replicate our findings with 7- to 9-year-old children using a briefer experimental paradigm, and use this briefer paradigm to assess the earlier development of these concepts, focusing on 4- to 6-year-old children (Study 2). Finally, we introduce an even simpler version of the paradigm, using more basic vocabulary and a streamlined experimental protocol, designed to validate and refining our understanding of conceptual structure among 4- to 6-year-old children, as well as exploring how younger children’s attributions of different aspects of mental life might vary with age (Study 3).
Overview of Methods and Analyses
Studies 1-3 used very similar experimental paradigms and were designed with the same analyses in mind. Here we provide an overview of the methods and planned analyses for all of these studies; any details that varied across studies are supplied in the “Methods” section of each of the studies.
General methods
Following Weisman et al. (2017), these studies were designed with the goal of focusing participants’ attention on the similarities, differences, and relationships among various mental capacities.
To this end, each participant was either randomly or pseudo-randomly assigned to assess 1-2 target characters (e.g., a beetle, a robot, a goat, etc.) on a wide range of sensory, perceptual, emotional, social, cognitive, and other mental capacities, ranging in number from 18-40 across studies and presented in either a random or a pseudo-random (counterbalanced) order. Participants were presented with a vivid, full-color photograph of their assigned target in a naturalistic context (e.g., a beetle on a leaf; a robot in an office; a goat in a grassy field), which they had access to throughout the study.
On each trial, participants were asked a question of the form Do you think a [target] can [do X]? (e.g., “Do you think a beetle can feel happy?”; Studies 1-2) or Can [targets] [do X]? (Study 3) (e.g., “Can beetles feel happy?”). Participants responded on a three-point scale (no, coded as 0; kinda, coded as 0.5; or yes, coded as 1). Although a three-point scale is not optimal for factor analyses, pilot testing suggested that it was critical in allowing children to move fast enough through the study to answer all questions, and maintaining this within-subjects design was our top priority for the planned analyses.
See the Methods section for each study for details of the particular target characters and mental capacities included in each study, as well as the materials and physical setup.
Exploring conceptual structure through exploratory factor analysis (EFA)
Our primary goal in conducting these studies was to uncover a set of latent constructs that might plausibly have given rise to the observed correlations among mental capacity attributions in each group of participants. As such, our primary planned analysis for all studies was an exploratory factor analysis (EFA). Following Weisman et al. (2017), we interpreted each of the constructs (“factors”) as corresponding to a fundamental component of mental life, according to this group of participants; by extension, we consider the full set of factors for each sample to represent to the overall “conceptual structure” underlying mental capacity attributions for this group of participants.
For all EFAs, we used ordinary least squares to find the minimum residual solution, using the “psych” package for R (Revelle, 2018). Here we focus on results using Pearson correlations using pairwise complete observations. (See Online Supplementary Materials [OSM] for solutions using polychoric correlations, which are better suited to handle responses on a three-point scale but, to our eyes, tended to over-fit our data by suggesting that we should retain many factors that each accounted for only a small amount of the shared variance.)
In order to determine how many factors to retain, we examined the results of three factor retention protocols: (1) Parallel Analysis, which compares the observed correlation structure to the correlation structure arising from random datasets of the same size; (2) Minimizing the Bayesian Information Criterion (BIC), which is one method of optimizing both goodness of fit and parsimony; and (3) A set of factor retention criteria that have been used in Weisman et al.’s (2017) previous work, in which they began with the maximal number of factors according to an analysis of degrees of freedom, and retained factors that met all three of the following criteria: (a) had eigenvalues greater than 1.00, (b) individually accounted for greater than 5% of the shared variance before rotation, and (c) were the “dominant” factor (the factor with the strongest absolute factor loading) for at least 1 mental capacity after rotation. For each study, our interpretation of how best to characterize the dataset (i.e., how many factors we observe) was determined by the degree of consensus among these three protocols and the interpretability of the retained factors under each protocol.
Here we focus our interpretations on varimax-rotated solutions, which constrain all factors to be orthogonal. (See OSM for solutions using oblique [“oblimin”] rotations, which allow for correlated factors.)
Charting differences in the application of these concepts through regression analyses of factor scores
Having inferred a conceptual structure for a given group of participants via EFA, we then sought to examine attributions of mental capacities to the particular target characters included in each study within this conceptual structure: To what extent did participants attribute each of the fundamental components of mental life revealed by EFA to a given target character, and how did this attributions vary with age (either within an age group or between age groups)?
To explore this question, for each study we projected children’s data into adults’ conceptual space and examined “factor scores”—summaries of each participant’s attributions of each of factors revealed by EFA. We used the correlation-preserving “ten Berge” method (as implemented in the “psych” package; Revelle, 2018), imputing missing values using the mean (by target character, capacity, and age group). This yielded one factor score for each of (adults’) factors, for each participant. We consider these to be summaries of that person’s attributions of the corresponding latent construct.
We analyzed these factor scores via mixed effects Bayesian regression analyses using the “brms” package for R (Bürkner, 2017). In all of these analyses, we included the maximal random effect structures given the design for the relevant study. Further details varied by study, depending on the number of target characters included in that study, the number of factors revealed by EFA for the relevant group(s) of participants, and the goals of the analysis (e.g., comparing two age groups vs. examining continuous effects of age within one or more groups of participants).
Study 2
The goals of Study 2 were threefold.
First, we aimed to extend our findings with 7- to 9-year-old children in Study 1, by expanding the list of the target characters to include not only the two “edge cases” from Study 1 (a beetle and a robot), but a also a wider range of animate beings (a bird, a goat, and an elephant) and inanimate objects (a computer, a teddy bear, and a doll). In contrast to Study 1, where we tracked which mental capacities “hang together” when participants reasoned about controversial “edge cases” in social reasoning, Study 2 allowed us to track which mental capacities “hang together” when target characters are perceived to vary in their mental capacity profiles. In Weisman et al.’s original studies, this approach yielded a highly similar conceptual structure to the “edge case” approach (Weisman et al., 2017; Study 4). We reasoned that if this three-part conceptual structure is stable and robust by the age of 7-9 years, it should manifest among 7- to 9-year-old children under the same range of conditions that it does among adults.
Our second goal was to assess the earlier development of conceptual structure in a group of younger children. We targeted 4- to 6-year-old children for our younger age group because this has been identified as a period of dramatic development in several relevant domains. Many studies have documented shifts in children’s abilities to take others’ perspectives, represent false beliefs, and integrate representations of intentions and outcomes in evaluating moral responsibility (for reveiws, see Flavell, 1999; Wellman, 2015). The preschool years have also been the focus of a rich tradition of work on lay biology and the animate-inanimate distinction extending back nearly a century (e.g., Carey, 1985; R. Gelman, Spelke, & Meck, 1983; Medin, Waxman, Woodring, & Washinawatok, 2010; Piaget, 1929; for a review, see S. Gelman & Opfer, 2002). All of these accounts make the case that becoming a sophisticated reasoner—and particularly a sophisticated social reasoner—requires substantial refinement of one’s representations of others’ experiences, beliefs, desires, and needs. Might these refinements include changes to the structure of children’s concepts of mental life?
Our third goal was to examine age-related changes in which mental capacities tend to be attributed to which target characters. In summarizing the results of Study 1, we discussed mental capacity attributions as the “application” of concepts of mental life, in contrast to the conceptual “structure” revealed by exploratory factor analysis. By expanding the range of target characters included in the study, Study 2 provides an opportunity to explore changes in how children apply their developing concepts of mental life to a variety of animate beings and inanimate objects.
Method
Participants
365 people participated in this study, including a group of adults, a group of “older” children (7-9y), and a group of “younger” children (4-6y).
Adults (n=116) participated via MTurk in September 2018. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.45 for approximately 2-4 minutes of their time (median duration: 3.02 min). An additional 22 adults participated but were excluded for failing to respond sensibly to an open-ended question about what they had been asked to do in the study (e.g., copying and pasting text from the question, writing “good study,” or describing a different study, e.g., “I wrote an essay about nature”; n=11) or for failing to pass one or more attention checks (e.g., “Please select no”; n=11). According to self report, the final adult sample ranged in age from 20-69 years (median: 38y) and included slightly more men (53%) than women (47%). Adults predominantly identified as White (84%; 2% identified as more than one race/ethnicity, and \(\leq\) 4% as any other race/ethnicity).
We recruited two groups of children: “older” children (7-9y) and “younger” children (4-6y). Our planned sample size was 120 per age group, but we also retained a handful of extra participants who completed the study on the final day of data collection for each group.
The group that we will refer to as “older children” (n=125) ranged in age from 7.08-9.98 years (median: 8.56y), and participated at one of several San Francisco Bay Area museums or at their younger sibling’s preschool between July-December 2016. The study took most older children under 4 minutes to complete (median duration: 2.70 min). According to parental report, the sample of older children included slightly more boys (54%) than girls (45%); 1% of children’s gender was non-binary or unknown). Parents predominantly identified their children as White (30%), South Asian (14%), multiracial (11%), or East Asian (10%); \(\leq\) 7% of children were identified as any other race/ethnicity, and 22% of children’s parents declined to provide information on their race/ethnicity).
“Younger children” (n=124) ranged in age from 4.00-6.98 years (median: 5.03y), and participated either at a university-affiliated preschool or at a Bay Area museum between January-June 2017. The study took most younger children under 6 minutes to complete (median duration: 3.58 min). According to parental report and school records, the sample of younger children included roughly the same number of girls (48%) and boys (52%). Children were predominantly identified as multiracial (46%) or White (28%; \(\leq\) 6% of children were identified as any other race/ethnicity, and 5% of children’s parents declined to provide information on their race/ethnicity).
An additional 7 children participated but were excluded for being outside the target age ranges. At museums (but not at the preschool), children received a small thank-you gift (e.g., a sticker) for their participation.
Materials and procedure
Pilot testing suggested that working with younger children would require making a briefer experimental paradigm with fewer than the 40 questions included in Study 1; limiting the list to 20 questions seemed to allow children as young as 4 years of age to complete the study easily and without getting bored or frustrated, while still including enough items to enable us to proceed with our exploratory “dimensionality reduction” approach to uncovering conceptual structure.
Participants were assigned to evaluate one of the following target characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer (n per characater: 6-18 adults, 10-17 older children, and 12-16 younger children; see Figure 6 for exact counts).
Participants were assigned to target characters randomly, with two exceptions: (1) The doll and teddy bear conditions were run last for older children (but included in the initial randomization scheme for adults and younger children); and (2) Toward the end of data collection with children, children were assigned to conditions that had the fewest participants. (This was not possible with adults, which is why the number of adults per condition was more variable than the number of children per condition.) As in Study 1, a vivid, high-resolution photo of the target character in a naturalistic context was visible for the duration of the study.
Instructions and procedure were identical to Study 1, with two exceptions: (1) Participants rated the target character on 20 (rather than 40) mental capacities; and (2) For younger children, the experimenter read all questions out loud and children responded verbally.
The 20 mental capacities were a subset of the 40 items used in Study 1, chosen to include physiological sensations, emotional experiences, perceptual abilities, cognitive skills, capacities related to autonomy or agency, and social abilities; and to include some of the strongest-loading items for each of the three factors uncovered among adults in Study 1 (see Figure 1). As in Study 1, each mental capacity was associated with a short, preset definition. Both older and younger children were encouraged at the beginning of the study to ask questions if they did not know what a word meant, in which case they were given these definitions. (Adults did not have access to these definitions.)
After completing the 20 questions about mental capacities, for a subset of participants we also asked two additional questions: “Is a [target] made out of metal?” and “Can a [target] be turned on and off?” These questions were always asked last, and were not intended to be included in any of our primary analyses. See SOM for an analysis of responses to these questions.
Data processing
We planned to drop trials with response times that were faster than a preset criterion of 250ms, but there were none among children, and we failed to record response times among adults. As in Study 1, we retained participants regardless of skipped trials. Overall, none of adults or older children’s trials, and only 1.22% of younger children’s trials (n=30) were missing data.
For our exploratory factor analyses, we looked at each group of partipants (adults, older children, and younger children) separately, because EFA is a group-level analysis of the consensual conceptual structure and is not designed to model continuous participant-level variables like exact age. Our goal with these analyses was to examine discrete “snapshots” of this conceptual structure at two points in this continuous developmental trajectory.
Results
Conceptual structure: Adults
As in Study 1, two or our three methods for determining how many factors to retain (in this case, parallel analysis and Weisman et al.’s factor retention criteria) suggested retaining three factors. (Minimizing BIC suggested retaining four factors, but the fourth factor was the dominant factor for only 1 mental capacity: feel happy; see SOM.)
As expected, the conceptual structure revealed by this analysis among adults was characterized by a three-way distinction between BODY (first factor, 38% of the shared variance in the rotated three-factor solution), HEART (second factor, 33% of shared variance), and MIND (third factor, 29% of shared variance). See Figure 5, Panel D.
This suggests that our modified child-friendly paradigm was valid: Using a shorter list of items and a wider range of target characters elicited the same intuitive ontology of mental life, among US adults, that was revealed in Study 1 and in Weisman et al.’s (2017) previous work.
Conceptual structure: Older children (7-9y)
Our three methods for determining how many factors to retain all suggested retaining three factors. As in Study 1, the conceptual structure revealed by this analysis among 7- to 9-year-old children was very similar to that of adults, again characterized by a three-way distinction between BODY, HEART, and MIND.
After rotation, the first factor corresponded primarily to physiological sensations. An analysis of factor congruence confirmed that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.97; with HEART: 0.65; with MIND: 0.63). It was the dominant factor for such items as get hungry, feel scared, feel pain, and smell things, and accounted for 39% of the shared variance in the rotated three-factor solution.
The second factor corresponded primarily to social-emotional abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.98; with BODY: 0.66; with MIND: 0.48). It was the dominant factor for such items as feel guilty, feel proud, feel embarrassed, and feel sad, and accounted for 35% of the shared variance in the rotated three-factor solution.
The third factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.96; with HEART: 0.47; with BODY: 0.62). It was the dominant factor for such items as figure out how to do things, make choices, remember things, and sense temperatures, and accounted for 26% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel C, for all factor loadings.)
We consider this to be a close conceptual replication of our Study 1 findings, suggesting that by the age of 7-9 years, this three-part conceptual structure is stable and robust to a range of experimental conditions.
Conceptual structure: Younger children (4-6y)
Our three methods for determining how many factors to retain each suggested retaining different numbers of factors: Weisman et al.’s factor retention criteria suggested retaining 3 factors, parallel analysis suggested retaining 2 factors, and minimizing BIC suggested a null, 1-factor solution. Here we present both the two- and three-factor solutions. (See SOM for factor loadings on the one “factor” in the null, one-factor solution, which yielded particularly strong loadings for social-emotional experiences and physiological sensations, such as get hungry, feel tired, feel happy, and feel proud.)
Three-factor solution
In the rotated three-factor solution suggested by Weisman et al.‘s retention criteria, the first factor corresponded primarily to physiological sensations, as well as some positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.92), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.81; with MIND: 0.7). It was the dominant factor for such items as get angry, get hungry, get hurt feelings, and feel tired, and accounted for 40% of the shared variance in the rotated three-factor solution.
The second factor corresponded primarily to perceptual-cognitive abilities, as well as one complex negative emotion (feel guilty). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.67; with BODY: 0.71). It was the dominant factor for such items as sense temperatures, remember things, feel guilty, and figure out how to do things, and accounted for 30% of the shared variance in the rotated three-factor solution.
The third factor corresponded primarily to social-emotional abilities, with particularly strong loadings for positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.87), but also quite similar to adults’ BODY factor (cosine similarity with BODY: 0.81; with MIND: 0.62). It was the dominant factor for such items as feel happy, feel love, feel proud, and feel scared, and accounted for 30% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel B, for all factor loadings.)
We would describe this conceptual structure as reminiscent of the BODY-HEART-MIND structure found among older children and adults, but not as fully “adult-like.” In particular, in this structure, the physiological sensations associated with the BODY among older children and adults are not as clearly differentiated from the emotional experiences associated with the HEART. Indeed, it it not clear that BODY vs. HEART is the most salient distinction among the first and third factors in this solution: A cleaner description of these factors might be negatively-valenced experiences vs. positively-valenced experiences.
Two-factor solution
In the rotated two-factor solution suggested by parallel analysis, the first factor encompassed both physiological sensations and emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.93), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.88; with MIND: 0.7). It was the dominant factor for such items as get hungry, feel sick, feel happy, and get angry, and accounted for 65% of the shared variance in the rotated two-factor solution.
The second factor corresponded primarily to perceptual-cognitive abilities, as well as one complex negative emotion (feel guilty). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.7; with BODY: 0.73). It was the dominant factor for such items as sense temperatures, remember things, feel guilty, and sense whether something is close by or far away, and accounted for 35% of the shared variance in the rotated three-factor solution. (See Figure 5, Panel A, for all factor loadings.)
In relation to the BODY-_HEART-MIND structure found among older children and adults, we would describe this two-factor structure as being anchored by a contrast between the cognitive capacities of the MIND vs. a set of warmer, more visercal experiences that constitute a more integrated representation of BODY-HEART.

Attributions of mental life
In Study 1, we saw that even children as old as 7-9y—whose conceptual structure seemed to be quite similar to that of adults’—nonetheless differed from adults in their application of this concept, attributing far more of the social-emotional abilities related to the HEART to both beetles and robots. How do children’s mental capacity attributions compare to adults for the larger set of target characters included in Study 2—and what does this aspect of conceptual developmental look like earlier in development (4-6y)?
Differences across age groups
Following Study 1, we projected all of children’s responses into the factor space defined by adults (standardized in terms of adults’ responses), and examined factor scores by age group (again, using the method articulated by ten Berge et al., 1999). As in Study 1, this yielded three scores for each participant, corresponding, in principle, to holistic judgments of the social-emotional, physiological, and perceptual-cognitive abilities of the target character the participant evaluated. (Note that each of these three scores takes into account adult factor loadings for all 20 mental capacities, as shown in Figure 5, Panel D.) This allowed us to examine the effects of age group (younger children, older children, adults), factor (BODY, HEART, MIND), and target character on these scores via mixed effects Bayesian regression. As in Study 1, factor was effect-coded, and age group was dummy-coded with adults as the baseline, to assess whether children in each age group were “adult-like” in their assessments. To examine differences in mental capacity attributions to different target characters, we coded each character as either “animate” (elephant, goat, mouse, bird, beetle) or “inanimate” (computer, robot, doll, teddy bear), and included animacy status (effect-coded) as a fixed effect in our regression model. We included intercepts and slopes for individual characters as random effets in our model, along with intercepts for individual participants.
The results of this model can be found in Table 3.
Table 3: Fixed effects from a mixed-effects Bayesian regression model predicting factor scores in Study 2 by animacy status (animates, inanimates), factor (BODY, HEART, MIND), and age group (4-6y, 7-9y, adults). The model used the formula 'factor score ~ factor * age group * animacy + (1 | subject) + (1 + factor + age group | character)' and was implemented in the 'brms' package for R (Bürkner, 2017). Animacy status and factor were effect-coded; age-group was dummy-coded with adults as the baseline. Asterisks mark parameters whose 95% credible interval does not include 0.
| Parameter |
b |
Error |
95% CI |
|
| Adults |
| (Intercept) |
-0.08 |
0.07 |
[-0.23, 0.05] |
|
| HEART (vs. grand mean) |
0.03 |
0.10 |
[-0.17, 0.21] |
|
| MIND (vs. grand mean) |
0.00 |
0.17 |
[-0.35, 0.34] |
|
| characters: animates vs. inanimates |
0.49 |
0.07 |
[ 0.36, 0.63] |
* |
| characters (animates/inanimates) × HEART |
-0.26 |
0.10 |
[-0.46, -0.07] |
* |
| characters (animates/inanimates) × MIND |
-0.09 |
0.18 |
[-0.44, 0.26] |
|
| 7-9y vs. adults |
| age group (7-9y vs. adults) |
0.16 |
0.09 |
[-0.02, 0.34] |
|
| HEART × age group (7-9y/adults) |
0.51 |
0.09 |
[ 0.34, 0.69] |
* |
| MIND × age group (7-9y/adults) |
-0.44 |
0.09 |
[-0.61, -0.26] |
* |
| characters (animates/inanimates) × age group (7-9y/adults) |
-0.19 |
0.09 |
[-0.37, -0.01] |
* |
| characters (animates/inanimates) × HEART × age group (7-9y/adults) |
0.08 |
0.09 |
[-0.09, 0.26] |
|
| characters (animates/inanimates) × MIND × age group (7-9y/adults) |
-0.28 |
0.09 |
[-0.46, -0.11] |
* |
| 4-6y vs. adults |
| age group (4-6y vs. adults) |
0.08 |
0.08 |
[-0.08, 0.22] |
|
| HEART × age group (4-6y/adults) |
0.78 |
0.09 |
[ 0.61, 0.96] |
* |
| MIND × age group (4-6y/adults) |
-0.81 |
0.09 |
[-0.99, -0.62] |
* |
| characters (animates/inanimates) × age group (4-6y/adults) |
-0.26 |
0.07 |
[-0.41, -0.12] |
* |
| characters (animates/inanimates) × HEART × age group (4-6y/adults) |
0.29 |
0.09 |
[ 0.12, 0.47] |
* |
| characters (animates/inanimates) × MIND × age group (4-6y/adults) |
-0.18 |
0.09 |
[-0.36, 0.00] |
* |
By definition, adults’ factor scores did not differ across factors (HEART vs. grand mean: b = 0.03, 95% credible interval: [-0.17, 0.21]; MIND vs. grand mean: b = 0.00, 95% credible interval: [-0.35, 0.34]). As we would expect, adults attributed more mental capacities (collapsing across factors) to animates than inanimates (b = 0.49, 95% credible interval: [0.36, 0.63])—a difference that was diminished in the HEART domain (b = -0.26, 95% credible interval: [-0.46, -0.07]), but not substantially diminished in the MIND domain (b = -0.09, 95% credible interval: [-0.44, 0.26]).
As a group, 7- to 9-year-old children’s mental capacity attributions did not differ from adults, collapsing collapsing across factors and characters (b = 0.16, 95% credible interval: [-0.02, 0.34])—but this masks several important differences between older children and adults. As in Study 1, older children’s scores were characterized by a relative over-attribution of abilities in the HEART domain (b = 0.51, 95% credible interval: [0.34, 0.69]), and a relative under-attribution of abilities in the MIND domain (b = -0.44, 95% credible interval: [-0.61, -0.26]). Collapsing across factors, older children made less of a distinction between animate an inanimate target characters, relative to adults (b = -0.19, 95% credible interval: [-0.37, -0.01]). This relative under-differentiation of animate and inanimate characters was particularly pronounced in the MIND domain (b = -0.28, 95% credible interval: [-0.46, -0.11]).
How did younger children compare to adults? As a group, 4- to 6-year-old children’s mental capacity attributions did not differ from adults, collapsing collapsing across factors and characters (b = 0.08, 95% credible interval: [-0.08, 0.22])—but again, this masks a variety of developmental differences that generally parallel the differences between older children and adults just described. Much like older children, younger children’s scores were characterized by a relative over-attribution of abilities in the HEART domain (b = 0.78, 95% credible interval: [0.61, 0.96]) and a relative under-attribution of abilities in the MIND domain (b = -0.81, 95% credible interval: [-0.99, -0.62]), and they differentiated less between animate an inanimate target characters than did adults (b = -0.26, 95% credible interval: [-0.41, -0.12]). This relative under-differentiation of animate and inanimate characters was particularly pronounced in the MIND domain (b = -0.18, 95% credible interval: [-0.36, 0.00]), and less pronounced in the HEART domain (b = 0.29, 95% credible interval: [0.12, 0.47]).

A visual inspection of Figure 6 further clarifies these findings.
In the BODY domain, a distinction between animate and inanimate target characters was clearly present in all age groups, though slightly attenuated among 4- to 6-year-old children (see Figure 6, Panel A, top row). A closer look at factor scores for individual characters (Panel B, top row) suggests that younger children diverged from adults primarily in their attributions to the “edge cases” that were the focus of Study 1: the robot (to which they over-attributed the physiological sensations related to the BODY), and the beetle (to which they under-attributed such BODY capacities). Older children’s BODY attributions were generally indistinguishable from adults’ for almost all target characters. (The only possible exception is the bird—but, in our view, it appears that this was driven by adults slightly under-attributing BODY capacities to this character.)
In the HEART domain, the distinction between animate and inanimate target characters was subtler across all age groups, and the degree of distinction did not vary dramatically with age (see Figure 6, Panel A, middle row). Instead, children generally over-attributed HEART to both animates and inanimates; these over-attributions declined between 4-6y and 7-9y of age, but did not reach adult-like levels even among older children. This is consistent with Study 1, in which 7- to 9-year-old children over-attributed HEART to both the beetle and the robot, relative to adults. In this study, older children again attributed more HEART capacities to the beetle and the robot, but also to the mouse and the goat (see Panel B, middle row). Relative to other animates, adults attributed particularly few HEART capacities to the mouse and the goat—perhaps because of their respecive statuses as vermin and food animals in this cultural context.
Finally, in the MIND domain, neither group of children made a robust distinction between animates and inamates—but adults clearly did (see Figure 6, Panel A, bottom row). Instead, children generally under-attributed MIND to both animates and inanimates. These under-attributions became less dramatic between 4-6y and 7-9y of age, and by 7-9y children’s MIND attributions to inanimates were adult-like. But even at 7-9y, children did not attributed as many MIND capacities to animates as did adults; between 7-9y and adulthood, MIND attributions increased for all of the animate characters, and particularly dramatically for the bird, the mouse, and the elephant (see Figure 6, Panel B, bottom row).
The raw data further supporst these observations; see Figure 7 for raw counts of no, kinda, and yes responses for all items, grouped by factor, animacy status (Panels A-C) or character (Panels D-F), and age group. For example, consider pain (the first capacity under BODY): Across age groups, most participants said that an elephant could feel pain, with the proportion of “yes” responses increasing across age groups; meanwhile, few participants said that a computer could feel pain, with the proportion of “yes” responses decreasing across age groups. More dramatic changes are evident in the HEART and MIND factors, with attributions of HEART generally decreasing across age groups (especially to inanimate target characters - e.g., the computer, the robot), and attributions of MIND generally increasing across age groups (especially to animate target characters - e.g., the mouse, the goat, the elephant). (See SOM for an analysis, parallel to the regression analyses here, of the proportion of the top-loading mental capacities for each factor that were endorsed by participants of different ages.)

Age differences within the child samples
As in Study 1, we were interested not only in differences across age groups, but also across the—even wider—age range within our child samples. In Study 2, this included children as young as 4 years up to nearly 10 years of age. This allowed us to look at age-related differences in mental capacity attributions across a wide period from early to middle childhood.
To explore age-related differences continuously within the child samples, we conducted an additional regression analysis on children’s factor scores alone, including interactions with exact age in years (centered at the mean: 6.73y) rather than age group. See Table 4 for the full results of this model, and Figure 8 for a visualization of changes in children’s factor scores across the age range.
This analysis confirmed that, relative to the grand mean, attributions of HEART decreased with age (b = -0.09, 95% credible interval: [-0.14, -0.04]) and attributions of MIND increased with age (b = 0.13, 95% credible interval: [0.07, 0.18]). These findings are both in line with the age group analysis described in the previous section, suggesting that the observed group differences correspond to gradual developmental differences as children’s responses become increasingly adult-like.
If children were also becoming increasingly adult-like in their distinctions between animate and inanimate target characters, based on the results of our age group analysis (previous section) we would also expect the overall animate-inanimate distinction to increase with age, driven primarily by increases in the BODY and especially MIND domains (see Figure 6, Panel A). Instead, collapsing across factors, the general distinction between animates and inanimates did not differ with age (b = 0.01, 95% credible interval: [-0.02, 0.05]); decreased in the HEART domain, relative to the grand mean (b = -0.06, 95% credible interval: [-0.11, -0.01]); and did not change substantially in the MIND domain (b = -0.04, 95% credible interval: [-0.09, 0.01]).
We note that participants who assessed the robot seemed to become particularly un-adult-like at older ages (see Figure 8, Panel B, in blue). Excluding these participants yields a more coherent picture of increasing adult-like-ness with increasing age (Figure 8, Panel A, in turquoise). This did not appear to be the case when excluding any of the other inanimate target characters. We elaborate on children’s conceptualizations of the mental lives of robots in particular in the General Discussion (see also Weisman, under review). (See also SOM for an analysis of how excluding any individual target character, or any individual mental capacity, affects the conceptual structures revealed by factor analysis for each of the three age groups in Study 2.)
Table 4: Fixed effects from a mixed-effects Bayesian regression model of children's responses, predicting factor scores in Study 2 by animacy status (animates, inanimates), factor (BODY, HEART, MIND), and exact age. The model used the formula 'factor score ~ factor * age * animacy + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). Factor and animacy were effect-coded, and age was mean-centered. Asterisks mark parameters whose 95% credible interval does not include 0.
| Parameter |
b |
Error |
95% CI |
|
| Collapsing across age |
| (Intercept) |
0.04 |
0.05 |
[-0.07, 0.15] |
|
| HEART (vs. grand mean) |
0.68 |
0.09 |
[ 0.49, 0.86] |
* |
| MIND (vs. grand mean) |
-0.64 |
0.15 |
[-0.94, -0.35] |
* |
| characters: animates vs. inanimates |
0.27 |
0.05 |
[ 0.16, 0.38] |
* |
| characters (animates/inanimates) × HEART |
-0.07 |
0.09 |
[-0.25, 0.11] |
|
| characters (animates/inanimates) × MIND |
-0.31 |
0.14 |
[-0.58, -0.02] |
* |
| Age effects |
| age (centered at the mean) |
0.03 |
0.02 |
[ 0.00, 0.07] |
|
| HEART × age |
-0.09 |
0.03 |
[-0.14, -0.04] |
* |
| MIND × age |
0.13 |
0.03 |
[ 0.07, 0.18] |
* |
| characters (animates/inanimates) × age |
0.01 |
0.02 |
[-0.02, 0.05] |
|
| characters (animates/inanimates) × HEART × age |
-0.06 |
0.03 |
[-0.11, -0.01] |
* |
| characters (animates/inanimates) × MIND × age |
-0.04 |
0.03 |
[-0.09, 0.01] |
|

Discussion
We had three goals in Study 2: (1) To test whether the adult-like conceptual structure revealed among 7- to 9-year-old children in Study 1 would hold under the range of conditions that elicit this structure among US adults in Weisman et al.’s (2017) previous work; (2) To explore conceptual structure at an earlier point in development (4-6y); and (3) To explore age-related differences in the application of concepts of mental life by examining which mental capacities participants of different ages tended to attribute to the nine target characters included in this study.
Conceptual structure is robust among 7- to 9-year-old children
Regarding our first goal, Study 2 suggests that the three-part conceptual structure—anchored by BODY, HEART, and MIND—is reliable and robust among 7- to 9-year-old US children. As in Weisman et al.’s (2017) original work with adults, the capacities that “hang together” in older children’s reasoning when target characaters are perceived to vary in mental capacity profiles appear to be highly similiar to those that “hang together” when participants disagree about the mental lives of controversial “edge cases” in social reasoning (Study 1).
Conceptual structure changes between 4-6y and 7-9y
Regarding our second goal, Study 2 suggests that this conceptual structure undergoes substantial changes between early and middle childhood. Like older children and adults, 4- to 6-year-old children’s responses were characterized by strong correlations among a suite of perceptual and cognitive capacities that we have labeled MIND. This highlights one aspect of conceptual structure that seems to be relatively stable from early childhood onward.
However, in contrast to the clear distinction between physiological abilities and social-emotional abilities that characterized mental capacity attributions among older children and adults, younger children’s responses suggest that they perceived physiological and social-emotional abilities to be more closely integrated and the line between them to be more blurred.
One indication of this blurring comes from the two-factor solution suggested by parallel analysis, in which a single BODY-HEART factor emerged and was highly congruent with both the BODY (cosine similarity: 0.93) and HEART (0.88) factors of adults. Among the mental capacities that loaded strongly (\(\geq\) 0.60) on this factor were both physiological sensations (e.g., get hungry, feel sick…) and social-emotional experiences (feel happy, feel proud, feel sad, get hurt feelings), suggesting that younger children perceived physiological and social-emotional abilities to “go together” to a considerable degree.
Even in the 3-factor solution suggested by Weisman et al.‘s (2017) original factor retention protocol, the distinction between physiological and social-emotional abilities was somewhat blurred. While the first factor, which we’ve labeled BODY*, was highly congruent with adults’ BODY factor (cosine similarity: 0.92), it was also the dominant factor for two social-emotional items (get hurt feelings, feel sad). And while the third factor, which we’ve labeled HEART*, was highly congruent with adults’ HEART factor (cosine similarity: 0.87), there were several social-emotional items that failed to load strongly on it (loadings \(\leq\) 0.40: feel embarrassed, feel sad, get hurt feelings, feel guilty). Stepping back, it is not clear that “physiological vs. social-emotional” is the best way to characterize the differences between these two factors. In fact, given that the strongest-loading items for BODY* were negatively valenced (get angry, get hungry, get hurt feelings) while the strongest-loading items for HEART* were positively valenced (feel happy, feel love, feel proud), it seems plausible that the more salient distinction among this age group may have been positive vs. negative valence, rather than BODY vs. HEART. The salience on negative vs. positive experiences among younger children is consistent with recent work on the development of emotion concepts, which suggests that emotion representations are dominanted by a single dimension of valence in early to middle childhood, before unfolding into a two-dimensional space characterized by valence and arousal over the course of later childhood and adolesence (Nook et al., 2017).
Finally, the very fact that different approaches to factor retention yielded different results is further evidence that, although we observed some evidence for a nascent distinction between BODY and HEART among 4- to 6-year-old children, this distinction was not as robust as it appeared to be among older children or adults.
Developmental changes in attributions of all three components of mental life—BODY, HEART, and MIND—begin by early childhood and continue into middle childhood
Regarding our third goal, Study 2 revealed a wide variety of age-related changes in children’s mental capacity attributions, in all three aspects of mental life as conceptualized by adults.
In Study 1, we observed that 7- to 9-year-old children’s attributions of HEART were particularly un-adult-like: As a group, these children attributed much more in the way of social-emotional abilities to both a beetle and a robot than did adults (according to an analysis of factor scores, with children’s data projected into adults’ conceptual space). In the Study 1 sample, this difference appeared to decline with age between 7-9y, but never quite reached adult-like levels.
In line with this, Study 2 also revealed age-related differences in attributions of HEART: Relative to adults, children across the age range tended to over-attribute social-emotional abilities—not only to the robot and the beetle, but to most of the target characters included in this study (see Figure 6). Again, this tendency generally declined with age, with one exception: If anything, children’s attributions of HEART to robots appeared to increase between 4-9y of age in this sample (though not substantially, according to a Bayesian regression: b = 0.16, 95% credible interval: [-0.05, 0.37]). The subset of 4- to 9-year-old children who assessed the robot (n=26) in Study 2 constituted a much smaller sample than the 96 7- to 9-year-old children who assessed the robot in Study 1, so the “true” developmental trajectory of HEART attributions to robots remains unclear. (We return to this question armed with more data from 4- to 6-year-old children in Study 3, and make further remarks on children’s attributions to robots more generally in the General Discussion.) Setting aside robots for the moment, our general take-aways from Studies 1-2 are that chidlren’s attributions of social-emotional abilities (what we call HEART) appear to undergo especially dramatic developmental changes over the course of early and middle childhood. These changes seem to be generally monotonic in nature; that is, we see gradual decreases in social-emotional attributions across the board from 4-9y, and no strong evidence for non-linearities. Finally, these developmental changes appears to extend well into middle childhood, and perhaps beyond.
Beyond the general decline in HEART attributions with age, we also observed age-related differences in attributions of both BODY and especially MIND, which were revealed most clearly thorugh an examination of children’s mental capacity attributions to animate beings (beetle, bird, mouse, goat, elephant) vs. inanimate objects (computer, robot, doll, teddy bear).
In the BODY domain, a distinction between animate and inanimate target characters was clearly present even among the youngest children, but increased gradually across the 4-7y age range (appearing to reach a degree of separation comparable to adults sometime between 7-9y; see Figure 8). As described above, younger children diverged from adults primarily in their attributions of BODY to the “edge cases” that were the focus of Study 1: the robot and the beetle. Looking back at Study 1, we observe a similar, though subtler, pattern even among 7- to 9-year-old children when the set of target characters was limited to these edge cases. Taken together, these results suggest that while by the age of 4-6y children are relatively far along in their mastery of which entities in the world are subject to the physiological sensations of the BODY, they continue to refine their application of this concept throughout early (and perhaps into middle) childhood.
Finally, in the MIND domain, we observed unanticipated age-related differences that were perhaps even more striking than the differences in the HEART domain described earlier. Relative to adults, children across the age range tended to under-attribute perceptual and cognitive abilities, both to inanimate target characters and especially to animate target characters. Generally speaking, children’s under-attributions of MIND became less pronounced with age—but even the oldest children attributed less in the way of perceptual-cognitive abilities to such target characters as the elephant, the mouse, and the bird than did adults (see Figure 6).
Interim summary
In Studies 1-2 we documented differences in the conceptual structure underlying mental capacity attributions between early childhood (4-6y) and middle childhood (7-9y), as well as age-related changes in children’s application of these concepts—i.e., their attributions of different aspects of mental life to different target characters—which appear to be underway by early childhood and extend well into middle childhood and beyond. We have interpreted both kinds of differences as aspects of conceptual development in this domain.
One major limitation of Studies 1-2, however, was that the task involved a rather advanced set of mental state vocabulary terms, including a variety of complex mental capacities (e.g., guilt, pride, awareness, depth perception) and using somewhat complicated syntax for some items (e.g., sense whether something is close by or far away, figure out how to do things). For 4- to 6-year-old children, in particular, some of the mental capacity items might have been outside of the range of the words they normally hear in discussions of mental states—let alone the words they normally use themselves. In addition, younger children may have found some aspects of the experimental paradigm distracting (e.g., being seated in front of the experimenter’s laptop computer without being allowed to use it themselves) or difficult (e.g., using a three-point scale with minimal visual scaffolding; see SOM for an analysis of scale use across age groups).
Thus, in our final study, we focused on 4- to 6-year-old children, using a simpler set of mental capacities and a modified version of the experimental paradigm (validated among adults) with the aim of getting a clearer picture of conceptual structure and mental capacity attributions at this earlier point in development.
LS0tCnRpdGxlOiAiQ2hpbGRyZW4ncyBkZXZlbG9waW5nIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZTogQ2hhbmdlcyBpbiBjb25jZXB0dWFsCiAgc3RydWN0dXJlIGJldHdlZW4gNC05IHllYXJzIG9mIGFnZSIKYXV0aG9yOiAiS2FyYSBXZWlzbWFuLCBDYXJvbCBTLiBEd2VjaywgJiBFbGxlbiBNLiBNYXJrbWFuIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCnN1YnRpdGxlOiAiRHJhZnQgdXBkYXRlZCAyMDE4LTA5LTI2IgphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vd29yZC1zdHlsZXMtcmVmZXJlbmNlLmRvY3giCiMgYWx3YXlzX2FsbG93X2h0bWw6IHllcwogICAKIyAjIGZvciBrbml0dGluZyB0byAubmIuaHRtbCAKIyBvdXRwdXQ6CiMgICBodG1sX25vdGVib29rOgojICAgICB0b2M6IHllcwojICAgICB0b2NfZGVwdGg6IDQKIyAgICAgdG9jX2Zsb2F0OiB5ZXMKYGBgCgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxhbmdjb2cpICMgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbGFuZ2NvZy9sYW5nY29nLXBhY2thZ2UKIyBsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJtcykKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoa2FibGVFeHRyYSkKCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyfQojIHN1cHBvcnRpbmcgZnVuY3Rpb25zCnNvdXJjZSgiLi9zY3JpcHRzL21heF9mYWN0b3JzX2VmYS5SIikKc291cmNlKCIuL3NjcmlwdHMvcmV0ZW5fZnVuLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvZWZhX2Z1bi5SIikKCiMgZGF0YSBzY3JpcHRzCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczFfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczFfNzkuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfNzkuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczJfNDYuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczNfYWQuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2RhdGFfczNfNDYuUiIpCgojIGZ1bmN0aW9uIGZvciBxdWlja2x5IGdldHRpbmcgY291bnRzIGFuZCBwcm9wb3J0aW9ucyBmb3IgY2F0ZWdvcmljYWwgZGVtbyB2YXJpYWJsZXMKZGVtb19mdW4gPC0gZnVuY3Rpb24oZGYsIHZhciwgbl9yb3VuZCA9IE5BKXsKICBuZXdfZGYgPC0gZGYgJT4lCiAgICBkaXN0aW5jdF8oInN1YmlkIiwgdmFyKSAlPiUKICAgIG11dGF0ZV9hdCgudmFycyA9IHZhciwKICAgICAgICAgICAgICAuZnVucyA9IC4gJT4lIGFzLmNoYXJhY3RlcigpICU+JSByZXBsYWNlX25hKC4sICJNSVNTSU5HIikpICU+JQogICAgY291bnRfKHZhcikgJT4lCiAgICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhuKSkKICBpZighaXMubmEobl9yb3VuZCkpewogICAgbmV3X2RmIDwtIG5ld19kZiAlPiUgbXV0YXRlKHByb3AgPSByb3VuZChwcm9wLCBuX3JvdW5kKSkKICB9CiAgcmV0dXJuKG5ld19kZikKfQoKIyBmdW5jdGlvbiBmb3IgZ2V0dGluZyB3cml0ZS11cCBvZiBicm1zIG1vZGVsIHJlc3VsdHMKd3JpdGVfYl85NUNJX2Z1biA8LSBmdW5jdGlvbihtb2RlbCwgcGFyYW0sIHJvdW5kX24gPSAyKXsKICBmaXhlZiA8LSBmaXhlZihtb2RlbCkgJT4lIHJvdW5kKHJvdW5kX24pICU+JSBmb3JtYXQobnNtYWxsID0gcm91bmRfbikKICBiIDwtIGZpeGVmW3BhcmFtLCAiRXN0aW1hdGUiXQogIGxvd2VyIDwtIGZpeGVmW3BhcmFtLCAiUTIuNSJdCiAgdXBwZXIgPC0gZml4ZWZbcGFyYW0sICJROTcuNSJdCiAgdGV4dCA8LSBwYXN0ZTAoIl9iXyA9ICIsIGIsIAogICAgICAgICAgICAgICAgICIsIDk1JSBjcmVkaWJsZSBpbnRlcnZhbDogWyIsIGxvd2VyLCAiLCAiLCB1cHBlciwgIl0iKQogIHRleHQgPC0gZ3N1YigiXFxbICIsICJcXFsiLCB0ZXh0KQogIHJldHVybih0ZXh0KQp9CgpiaW5vbWlhbF9zbW9vdGggPC0gZnVuY3Rpb24oLi4uKSB7CiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwgLi4uKQp9CgppdGFsX2J5X2NhcF9mdW4gPC0gZnVuY3Rpb24oc3RyKSB7CiAgcGFzdGUwKCJfIiwgcGFzdGUoc3RyLCBjb2xsYXBzZSA9ICJfLCBfIiksICJfIikKfQpgYGAKCmBgYHtyfQojIHdoYXQgY29ycmVsYXRpb24gdG8gdXNlCmNob3Nlbl9jb3IgPC0gImNvciIgIyByZXBvcnRlZAojIGNob3Nlbl9jb3IgPC0gInBvbHkiICMgYWx0ZXJuYXRpdmUgb3B0aW9uCgojIHdoYXQgcm90YXRpb24gdG8gdXNlCmNob3Nlbl9yb3QgPC0gInZhcmltYXgiICMgcmVwb3J0ZWQKIyBjaG9zZW5fcm90IDwtICJvYmxpbWluIiAjIGFsdGVybmF0aXZlIG9wdGlvbgoKIyB3aGF0IGZhY3RvcmluZyBtZXRob2QgdG8gdXNlCmNob3Nlbl9mbSA8LSAibWlucmVzIiAjIHJlcG9ydGVkIChzZWUgYWx0ZXJuYXRpdmUgb3B0aW9ucyBpbiA/ZmEpCgojIHdoYXQgc2NvcmluZyBtZXRob2QgdG8gdXNlCmNob3Nlbl9zY29yZXMgPC0gInRlbkJlcmdlIiAjIHJlcG9ydGVkCiMgY2hvc2VuX3Njb3JlcyA8LSAicmVncmVzc2lvbiIgIyBhbHRlcm5hdGl2ZSBvcHRpb24KYGBgCgojIEFic3RyYWN0CgpYWAoKIyBJbnRyb2R1Y3Rpb24KCkZyb20gZWFybHkgaW4gbGlmZSwgYXR0cmlidXRpb25zIG9mIG1lbnRhbCBzdGF0ZXMgc2hhcGUgb3VyIHNvY2lhbCBpbnRlcmFjdGlvbnMgYW5kIGluZm9ybSBvdXIganVkZ21lbnRzIG9mIG1vcmFsIHN0YXR1cy4gSW4gb3JkZXIgdG8gcHJlZGljdCBhbmQgZXhwbGFpbiBvdGhlcnPigJkgYmVoYXZpb3IsIHdlIG1ha2UgaW5mZXJlbmNlcyBhYm91dCB3aGF0IHRoZXkgcGVyY2VpdmUsIGJlbGlldmUsIGFuZCBkZXNpcmUuIEluIG91ciBzb2NpYWwgcmVsYXRpb25zaGlwcywgd2UgaGVscCBmcmllbmRzIHdpdGggdGhlaXIgZ29hbHMsIHRoaW5rIHRocm91Z2ggcHJvYmxlbXMgdG9nZXRoZXIsIGRlbGlnaHQgaW4gZWFjaCBvdGhlcidzIGhhcHBpbmVzcywgc2VlayBjb21mb3J0IGZyb20gZWFjaCBvdGhlciBpbiB0aW1lcyBvZiBzYWRuZXNzLCBhbmQgKGZvciB0aGUgbW9zdCBwYXJ0KSBkbyBvdXIgYmVzdCB0byBhdm9pZCBjYXVzaW5nIG91ciBsb3ZlZCBvbmVzIGVtb3Rpb25hbCBvciBwaHlzaWNhbCBwYWluLiBCZXlvbmQgdGhpcywgYXR0cmlidXRpb25zIG9mIG1lbnRhbCBjYXBhY2l0aWVzIHRvIG5vbi1odW1hbiBhbmltYWxzLCBzdXBlcm5hdHVyYWwgYmVpbmdzLCB0ZWNobm9sb2dpZXMsIGFuZCBvdGhlciBlbnRpdGllcyBoZWxwIHVzIHVuZGVyc3RhbmQgdGhlIGJvdW5kYXJpZXMgb2Ygb3VyIHNvY2lhbCB3b3JsZHMsIHNoYXBpbmcgb3VyIHBlcnNwZWN0aXZlcyBvbiBhbmltYWwgcmlnaHRzIChfRG8gY293cyBmZWVsIHBhaW4sIGZlYXIsIG9yIGxvdmU/XyksIGd1aWRpbmcgb3VyIHNwaXJpdHVhbCBhbmQgcmVsaWdpb3VzIGxpdmVzIChfSXMgR29kIGxpc3RlbmluZyB0byBteSBwcmF5ZXJzPyBXaGF0IGRvIG15IGFuY2VzdG9ycyBuZWVkIGFuZCB3YW50IGZyb20gbWU/XyksIGFuZCBoZWxwaW5nIHVzIGRlY2lkZSBob3cgdG8gaW50ZXJhY3Qgd2l0aCAiYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2VzIiAoX0lzIGl0IGNydWVsIHRvIGluc3VsdCBhIHZpcnR1YWwgcGVyc29uYWwgYXNzaXN0YW50PyBXaG8gb3Igd2hhdCBpcyB0byBibGFtZSB3aGVuIGFuIGF1dG9ub21vdXMgdmVoaWNsZSBjYXVzZXMgYW4gYWNjaWRlbnQ/XykuIEZyb20gdGhpcyBwZXJzcGVjdGl2ZSwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIGFyZSBhdCB0aGUgY29yZSBvZiBodW1hbiBzb2NpYWwgcmVhc29uaW5nIGFuZCBleHBlcmllbmNlLgoKQnV0ICJtZW50YWwgbGlmZSIgaXMgY29tcGxleC4gT24gdGhlIG9uZSBoYW5kLCBjYXBhY2l0aWVzIGZvciBwZXJjZXB0aW9uLCBiZWxpZWYsIGRlc2lyZSwgZ29hbHMsIHRob3VnaHRzLCBlbW90aW9ucywgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zLCBhbmQgb3RoZXIgbWVudGFsIHN0YXRlcyBoYXZlIHNvbWUgdGhpbmdzIGluIGNvbW1vbi4gRm9yIGV4YW1wbGUsIGluIHRoZSBXZXN0ZXJuIHdvcmxkIHdlIGNvbW1vbmx5IGNvbnNpZGVyIGFsbCBvZiB0aGVzZSBtZW50YWwgc3RhdGVzIHRvIG9jY3VyIGluc2lkZSBhIHBlcnNvbuKAmXMgbWluZDsgYW5kIGFsdGhvdWdoIHRoZXNlIG1lbnRhbCBzdGF0ZXMgbWlnaHQgZ3VpZGUgdGhhdCBwZXJzb27igJlzIG9ic2VydmFibGUgYmVoYXZpb3JzIChlLmcuLCBmYWNpYWwgZXhwcmVzc2lvbnMsIHdvcmRzLCBhbmQgYWN0aW9ucyksIG5vbmUgb2YgdGhlc2UgbWVudGFsIHN0YXRlcyBpcyBkaXJlY3RseSBvYnNlcnZhYmxlIHRvIGFueW9uZSBlbHNlLiBPbiB0aGUgb3RoZXIgaGFuZCwgZGlmZmVyZW50IGtpbmRzIG9mIG1lbnRhbCBzdGF0ZXMgZGlmZmVyIGluIGltcG9ydGFudCB3YXlzLiBUbyBnaXZlIGp1c3QgYSBmZXcgZXhhbXBsZXM6IFNvbWUgbWVudGFsIHN0YXRlcyBhcmUgY2xvc2VseSByZWxhdGVkIHRvIHNwZWNpZmljIGJvZGlseSBvcmdhbnMgKGUuZy4sIHdlIHNlZSB0aGluZ3Mgd2l0aCBvdXIgZXllcywgd2UgZmVlbCBodW5nZXIgaW4gb3VyIHN0b21hY2gpLCBhbmQgb3RoZXJzIGxlc3Mgb2J2aW91c2x5IHNvICh3aGVyZSBkbyB3ZSBleHBlcmllbmNlICJiZWxpZWYiPykuIFNvbWUgYXJlIHBvc2l0aXZlbHkgb3IgbmVnYXRpdmVseSB2YWxlbmNlZCAoZS5nLiwgcGFpbiBmZWVscyBiYWQsIGhhcHBpbmVzcyBmZWVscyBnb29kKSwgYW5kIG90aGVycyBhcmUgbW9yZSBuZXV0cmFsLCBvciB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgY2lyY3Vtc3RhbmNlIChlLmcuLCBiZWxpZWZzLCB0aG91Z2h0cykuIFNvbWUgbWVudGFsIHN0YXRlcyBpbnZvbHZlIHRha2luZyBpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW52aXJvbm1lbnQgKGUuZy4sIGhlYXJpbmcgYSBub2lzZSksIHdoaWxlIG90aGVycyBpbnZvbHZlIHN0b3Jpbmcgb3IgdXBkYXRpbmcgdGhhdCBpbmZvcm1hdGlvbiAoZS5nLiwgcmVtZW1iZXJpbmcsIGxlYXJuaW5nKSwgb3IgdXNpbmcgaXQgdG8gYnJpbmcgYWJvdXQgY2hhbmdlcyBpbiB0aGUgZXh0ZXJuYWwgd29ybGQgKGUuZy4sIHBsYW5uaW5nLCBtYWtpbmcgY2hvaWNlcykuIEZ1cnRoZXJtb3JlLCB3ZSBtaWdodCBhc3N1bWUgdGhhdCBjZXJ0YWluIGVudGl0aWVzIGluIHRoZSB3b3JsZCBoYXZlIGFsbCBvZiB0aGUgbWFueSBraW5kcyBvZiBleHBlcmllbmNlcyBhbmQgbWVudGFsIGNhcGFjaXRpZXMgdGhhdCB3ZSBkbyBvdXJzZWx2ZXMgKGUuZy4sIG90aGVyIGh1bWFucywgcGVyaGFwcyBzb21lIG90aGVyIG1hbW1hbHMpLCB3aGlsZSBiZWxpZXZpbmcgdGhhdCBvdGhlcnMgaGF2ZSBhIG1vcmUgbGltaXRlZCBzZXQgKGUuZy4sIHdlIG1pZ2h0IHRoaW5rIGEgYmVldGxlIGNvdWxkIG5ldmVyIHJlYXNvbiBhYm91dCBwaGlsb3NvcGh5LCBvciBkbyBjb21wbGV4IGNvbXB1dGF0aW9uczsgb3IgdGhhdCBhIHJvYm90IGlzIGluY2FwYWJsZSBvZiBmZWVsaW5nIGVtYmFycmFzc2VkLCBvciBndWlsdHkpLiAKCkZyb20gYW50aXF1aXR5IHRocm91Z2ggdGhlIHByZXNlbnQgZGF5LCBzY2hvbGFycyBhbmQgc3Bpcml0dWFsIGxlYWRlcnMgaGF2ZSBzcGVjdWxhdGVkIGFib3V0IGhvdyB0byBtYWtlIHNlbnNlIG9mIHRoZXNlIGNvbW1vbmFsaXRpZXMgYW5kIGRpZmZlcmVuY2Vz4oCUaW4gb3RoZXIgd29yZHMsIGFib3V0IHRoZSBuYXR1cmUgYW5kIHN0cnVjdHVyZSBvZiB3aGF0IHdlIHdpbGwgcmVmZXIgdG8gaW4gdGhpcyBwYXBlciBhcyAibWVudGFsIGxpZmUuIiBQbGF0byBhbmQgQXJpc3RvdGxlIGVhY2ggcHJvcG9zZWQgdGhhdCBwZW9wbGUgYXJlIGNvbXBvc2VkIG9mIHRocmVlIGNvbXBvbmVudHMgKGZvciBQbGF0bywgdGhlIGFwcGV0aXRlLCB0aGUgc3Bpcml0LCBhbmQgcmVhc29uOyBmb3IgQXJpc3RvdGxlLCB0aGUgaW50ZWxsZWN0dWFsLCBwZXJjZXB0dWFsLCBhbmQgbnV0cml0aXZlIHBhcnRzIG9mIHRoZSBzb3VsKTsgdGhlIEJ1ZGRoYSBpbnN0ZWFkIHNwb2tlIG9mIHBlb3BsZSBhbmQgb3RoZXIgc2VudGllbnQgYmVpbmdzIGFzIGZpdmUtcGFydCBhZ2dyZWdhdGlvbnMgKGNvbWJpbmF0aW9ucyBvZiBtYXRlcmlhbCBmb3JtLCBzZW5zYXRpb25zLCBwZXJjZXB0aW9ucywgdm9saXRpb25zIG9yICJtZW50YWwgZm9ybWF0aW9ucywiIGFuZCBjb25zY2lvdXNuZXNzKS4gSW4gdGhlIHR3ZW50aWV0aCBjZW50dXJ5LCBzb21lIHNvY2lhbCBhbmQgY29nbml0aXZlIHNjaWVudGlzdHMgdHVybmVkIGF3YXkgZnJvbSB0aGUgbWV0YXBoeWlzY2FsIHF1ZXN0aW9uIChfV2hhdCBpcyB0aGUgbWluZD9fKSBhbmQgdG93YXJkIGEgcHN5Y2hvbG9naWNhbCBxdWVzdGlvbjogX0hvdyBkbyBvcmRpbmFyeSBwZW9wbGUgcmVwcmVzZW50IHRoZSBtaW5kP18gRm9yIGV4YW1wbGUsIHRoZSBhbnRocm9wb2xvZ2lzdCBhbmQgY29nbml0aXZlIHNjaWVudGlzdCBSb3kgROKAmUFuZHJhZGUgKDE5ODcpIHByb3Bvc2VkIGEgImZvbGsgbW9kZWwgb2YgdGhlIG1pbmQiIGNvbXBvc2VkIG9mIHNpeCBjYXRlZ29yaWVzIChwZXJjZXB0aW9uczsgYmVsaWVmcyBhbmQga25vd2xlZGdlOyBmZWVsaW5ncyBhbmQgZW1vdGlvbnM7IGRlc2lyZXMgYW5kIHdpc2hlczsgaW50ZW50aW9uczsgYW5kIHJlc29sdXRpb24sIHdpbGwsIGFuZCBzZWxmLWNvbnRyb2w7IGZvciBhbHRlcm5hdGl2ZSBmb3JtdWxhdGlvbnMgb2YgZm9sayBtb2RlbHMgb2YgbWluZCBhcmlzaW5nIGZyb20gYSB2YXJpZXR5IG9mIGN1bHR1cmFsIGNvbnRleHRzLCBzZWUgSGVlbGFzICYgTG9jaywgMTk4MTsgTGlsbGFyZCwgMTk5ODsgTHVocm1hbm4gZXQgYWwuLCAyMDExKS4gCgpQc3ljaG9sb2dpc3RzIGludmVzdGlnYXRpbmcgX2NoaWxkcmVuJ3NfIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSBoYXZlIG1hZGUgcmVmZXJlbmNlIHRvIGNhdGVnb3JpZXMgbGlrZSAidmlzdWFsIHBlcmNlcHRpb24sIiAiYXR0ZW50aW9uLCIgImRlc2lyZXMsIiAiZW1vdGlvbnMsIiAiaW50ZW50aW9ucywiICJiZWxpZWZzIGFuZCByZWxhdGVkIG1lbnRhbCByZXByZXNlbnRhdGlvbnMsIiAia25vd2xlZGdlLCIgInByZXRlbnNlLCIgYW5kICJ0aGlua2luZywiIHRvIHF1b3RlIHRoZSBzZWN0aW9uIGhlYWRpbmdzIGluIEpvaG4gRmxhdmVsbOKAmXMgKDE5OTkpIHNlbWluYWwgcmV2aWV3IG9mIGNoaWxkcmVu4oCZcyByZWFzb25pbmcgYWJvdXQgdGhlIG1pbmQuIEluIHJlY2VudCBkZWNhZGVzIHRoZSBmaWVsZCBoYXMgbWFkZSBncmVhdCBwcm9ncmVzcyBpbiB1bmRlcnN0YW5kaW5nIGhvdyBjaGlsZHJlbiBtYWtlIHNlbnNlIG9mIG90aGVyIHBlb3BsZeKAmXMgbWluZHMgYnkgcG9zdHVsYXRpbmcgZGlzdGluY3QgcmVwcmVzZW50YXRpb25zIG9mIG90aGVyc+KAmSBwZXJjZXB0aW9ucywgYmVsaWVmcywgZGVzaXJlcywgYW5kIGVtb3Rpb25zLCBhbmQgZXhwbG9yaW5nIGhvdyBjaGlsZHJlbiBjb21lIHRvIGJ1aWxkIGFuZCBjb29yZGluYXRlIHRoZXNlIHJlcHJlc2VudGF0aW9ucyAoc2VlIFdlbGxtYW4sIDIwMTcsIGZvciByZXZpZXcpLiAKClN1Y2ggY2F0ZWdvcmllcyBoYXZlIGJlZW4gaW5jcmVkaWJseSB1c2VmdWwgaW4gdGhlc2UgZXhwbG9yYXRpb25zIG9mIGNoaWxkcmVu4oCZcyBzb2NpYWwgY29nbml0aXZlIGRldmVsb3BtZW504oCUYnV0IGRvIHRoZXkgY29ycmVzcG9uZCB0byBjaGlsZHJlbuKAmXMgb3duIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN0cnVjdHVyZSBvZiBtZW50YWwgbGlmZT8gIEhvdyBkbyBjaGlsZHJlbiBjb25jZWl2ZSBvZiB0aGUgY29ubmVjdGlvbnMgYW5kIGRpc3RpbmN0aW9ucyBhbW9uZyBtZW50YWwgc3RhdGVzLCBhbmQgaG93IGRvZXMgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBzaGFwZSB0aGVpciB1bmRlcnN0YW5kaW5nIG9mIHRoZSB2YXJpb3VzIGh1bWFucywgYW5pbWFscywgdGVjaG5vbG9naWVzLCBhbmQgb3RoZXIgImJlaW5ncyIgaW4gdGhlIHdvcmxkIGFyb3VuZCB0aGVtPwoKSW4gdGhlIGN1cnJlbnQgcGFwZXIsIHdlIHNldCBvdXQgdG8gZGVyaXZlIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgZW1waXJpY2FsbHksIHVzaW5nIGFuIGFwcHJvYWNo4oCUZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lz4oCUdGhhdCByZXZlYWxzIHRoZSBjb25jZXB0dWFsIGNvbm5lY3Rpb25zIGFuZCBkaXN0aW5jdGlvbnMgdW5kZXJseWluZyBwYXJ0aWNpcGFudHPigJkgcmVzcG9uc2VzIGZyb20gdGhlIGJvdHRvbSB1cCwgd2l0aG91dCByZWZlcmVuY2UgdG8gYSBwcmUtc3BlY2lmaWVkIGh5cG90aGVzaXMgb3IgdGhlb3J5LiBGcm9tIG91ciBwZXJzcGVjdGl2ZSwgdGhpcyBhcHByb2FjaCBoYXMgdHdvIG1ham9yIGFkdmFudGFnZXMuIEZpcnN0LCBpdCBjYW4gcmV2ZWFsIGNvbmNlcHR1YWwgc3RydWN0dXJlIHdpdGhvdXQgcmVxdWlyaW5nIHBhcnRpY2lwYW50cyB0byBhcnRpY3VsYXRlIGl0IHRoZW1zZWx2ZXMuIFNlY29uZCwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYXBwcm9hY2ggY2FuLCBpbiBwcmluY2lwbGUsIGRpZmZlciBkcmFtYXRpY2FsbHkgZnJvbSB0aGUgYXNzdW1wdGlvbnMgb2YgYSByZXNlYXJjaCB0ZWFtLiBUaGVzZSBhcmUgZXNwZWNpYWxhbHkgY29tcGVsbGluZyBhZHZhbnRhZ2VzIGluIHRoZSBkb21haW4gb2YgY29uY2VwdHVhbCBkZXZlbG9wbWVudOKAlGluIHdoaWNoLCBieSBkZWZpbml0aW9uLCBwYXJ0aWNpcGFudHMgc3RydWdnbGUgdG8gaW50cm9zcGVjdCBhbmQgYXJ0aWN1bGF0ZSB0aGVpciByZWFzb25pbmcsIGFuZCBmaW5kaW5ncyBvZnRlbiBjb25mbGljdCB3aXRoIGFkdWx0IGludHVpdGlvbnMuCgpUbyBvdXIga25vd2xlZGdlLCB0aGVyZSBoYXZlIGJlZW4gb25seSBhIGZldyBhdHRlbXB0cyB0byBkbyBzb21ldGhpbmcgc2ltaWxhciBpbiB0aGUgcGFzdC4gSW4gcGFydGljdWxhciwgaW4gYSBzZXJpZXMgb2Ygc3R1ZGllcyB3aXRoIDgtIHRvIDExLXllYXItb2xkIGNoaWxkcmVuLCBGYWJyaWNpdXMsIFNjaHdhbmVuZmx1Z2VsLCBhbmQgY29sbGVhZ3VlcyBleHBsb3JlZCBvbmUgY29ybmVyIG9mIHRoaXMgY29uY2VwdHVhbCBzcGFjZSwgZm9jdXNpbmcgb24gaG93IGNoaWxkcmVuIGNvbWUgZGlzdGluZ3Vpc2ggYW1vbmcgZGlmZmVyZW50ICJ3YXlzIG9mIGtub3dpbmcuIiBJbiB0aGVpciBpbml0aWFsIHN0dWR5LCA4LSBhbmQgMTAteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyByYXRlZCB0aGUgc2ltaWxhcml0eSBvZiBwYWlycyBvZiBzZW50ZW5jZXMgdGhhdCBpbnZvbHZlZCBlaXRoZXIgbWVtb3J5LCBjb21wcmVoZW5zaW9uLCBhdHRlbnRpb24sIG9yIGluZmVyZW5jZTsgdGhlaXIgcmVzdWx0cyBzdWdnZXN0ZWQgdGhhdCBjaGlsZHJlbiBncmFkdWFsbHkgY29tZSB0byBtYWtlIGRpc3RpbmN0aW9ucyBhbW9uZyB0aGVzZSBmb3VyIGFzcGVjdHMgb2Yga25vd2luZyBvdmVyIHRoZSBjb3Vyc2Ugb2YgbWlkZGxlIHRvIGxhdGUgY2hpbGRob29kLCBmaXJzdCBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIG1vcmUgImNvbmNlcHR1YWwiIHZzLiAicGVyY2VwdHVhbCIgYXNwZWN0cyBvZiBrbm93aW5nLCBhbmQgbGF0ZXIgY29taW5nIHRvIGRpZmZlcmVudGlhdGUgYW1vbmcgd2F5cyBvZiBrbm93aW5nIGFjY29yZGluZyB0byBob3cgbXVjaCB0aGV5IHJlbHkgb24gIm1lbW9yeSwiIHdpdGggZGV2ZWxvcG1lbnQgZXh0ZW5kaW5nIHBlcmhhcHMgaW50byBhZG9sZXNjZW5jZSAoRmFicmljaXVzLCBTY2h3YW5lbmZsdWdlbCwgS3lsbG9uZW4sIEJhcmNsYXksICYgRGVudG9uLCAxOTg5OyBTY2h3YW5lbmZsdWdlbCwgRmFicmljaXVzLCAmIE5veWVzLCAxOTk2OyBTY2h3YW5lbmZsdWdlbCwgRmFicmljaXVzLCBOb3llcywgJiBCaWdsZXIsIDE5OTQpLgoKVGhlcmUgaGFzIGJlZW4gc2xpZ2h0bHkgbW9yZSBleHBsb3JhdGlvbiBvZiBob3cgYWR1bHRzIGNvbmNlcHR1YWxpemUgbWVudGFsIGxpZmUuIFJpcHMgYW5kIENvbnJhZCAoMTk4OSksIGZvciBleGFtcGxlLCBjb25kdWN0ZWQgaW4tZGVwdGggYW5hbHlzZXMgb2YgZm9sayB0YXhvbm9taWVzIG9mIG1lbnRhbCBsaWZlIGJ5IGFza2luZyBhZHVsdHMgcXVlc3Rpb25zIGFib3V0IHdoaWNoIG1lbnRhbCBhY3Rpdml0aWVzIGFuZCBtZW50YWwgc3RhdGVzIGFyZSAicGFydHMiIG9yICJraW5kcyIgb2YgZWFjaCBvdGhlciAoZS5nLiwgIklzIHBsYW5uaW5nIGEga2luZCBvZiByZWFzb25pbmc/Iik7IGFuZCBNYWxsZSBhbmQgS25vYmUgKDE5OTcpIGV4cGxvcmVkIHRoZSAiZm9sayBjb25jZXB0IG9mIGludGVudGlvbmFsaXR5IiBieSBlbGljaXRpbmcgYW5kIGNvZGluZyBwYXJ0aWNpcGFudHPigJkgb3Blbi1lbmRlZCBkZWZpbml0aW9ucyBvZiB0aGUgdGVybSAiaW50ZW50aW9uYWwuIiBPbmUgZXNwZWNpYWxseSBleGNpdGluZyBhcHByb2FjaCB3YXMgcGlvbmVlcmVkIGJ5IEdyYXksIEdyYXksIGFuZCBXZWduZXIgKDIwMDcpIGluIHRoZWlyIHdvcmsgb24gaG93IGFkdWx0cyBwZXJjZWl2ZSBkaWZmZXJlbnQga2luZHMgb2Ygc29jaWFsIGJlaW5ncy4gRnJvbSBwYXJ0aWNpcGFudHPigJkgcmVzcG9uc2VzIHRvIHF1ZXN0aW9ucyBhYm91dCB0aGUgbWVudGFsIGNhcGFjaXRpZXMgb2YgdmFyaW91cyBjaGFyYWN0ZXJzIChlLmcuLCAiV2hpY2ggaXMgbW9yZSBjYXBhYmxlIG9mIGV4cGVyaWVuY2luZyBqb3k6IGEgZ3JlZW4gZnJvZyBvciBhIDUtbW9udGgtb2xkIGluZmFudD8iKSwgdGhlIGF1dGhvcnMgd2VyZSBhYmxlIHRvIGV4dHJhY3QgYSBjb25jZXB0dWFsIHNwYWNlIG9mIGNoYXJhY3RlcnMsIGNoYXJhY3Rlcml6ZWQgYnkgdHdvIGRpbWVuc2lvbnM6ICJleHBlcmllbmNlLCIgdGhlIGV4dGVudCB0byB3aGljaCBhIGNoYXJhY3RlciBpcyBjYXBhYmxlIG9mIGh1bmdlciwgZmVhciwgcHJpZGUsIGFuZCBvdGhlciBpbm5lciBleHBlcmllbmNlczsgYW5kICJhZ2VuY3ksIiB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgY2hhcmFjdGVyIGlzIGNhcGFibGUgb2Ygc2VsZi1jb250cm9sLCBtb3JhbGl0eSwgbWVtb3J5LCBhbmQgb3RoZXIgY2FwYWNpdGllcyBjZW50cmFsIHRvIGFjdGluZyBpbiB0aGUgd29ybGQuIAoKR3JheSBldCBhbC7igJlzICgyMDA3KSBhcHByb2FjaCBpcyBwYXJ0aWN1bGFybHkgY29tcGVsbGluZyB0byB1cyBhcyBkZXZlbG9wbWVudGFsIHBzeWNob2xvZ2lzdHMgYmVjYXVzZSBvZiBpdHMgc2ltcGxpY2l0eS4gUGFydGljaXBhbnRzIGluIHRoZWlyIHN0dWR5IGFuc3dlcmVkIGEgc2VyaWVzIG9mIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLCBjb25jcmV0ZSBxdWVzdGlvbnMsIHdoaWNoIGRyZXcgb24gdGhlaXIgaW50dWl0aW9ucyBhYm91dCBmYW1pbGlhciBlbnRpdGllcyBpbiB0aGUgd29ybGQgKGUuZy4sIGZyb2dzLCBpbmZhbnRzKS4gU3VjaCBxdWVzdGlvbnMgYXJlIGxpa2VseSBlYXNpZXIsIHF1aWNrZXIsIGFuZCBtb3JlIGVuam95YWJsZSBmb3IgcGFydGljaXBhbnRzIChlc3BlY2lhbGx5IGNoaWxkcmVuKSB0aGFuIHRoZSBkZW1hbmRpbmcgbWV0YWNvZ25pdGl2ZSB0YXNrcyB0aGF0IHByZXZpb3VzIHN0dWRpZXMgaGF2ZSBlbXBsb3llZCAoZS5nLiwgZGVjaWRpbmcgaG93IHNpbWlsYXIgdHdvIHNlbnRlbmNlcyBhcmUgImJhc2VkIG9uIHRoZSB3YXlzIHlvdSB1c2UgeW91ciBtaW5kIGluIGVhY2ggb25lIjsgRmFicmljaXVzIGV0IGFsLiwgMTk4OSwgcC4gMTI4MSkuCkhvd2V2ZXIsIEdyYXkgZXQgYWwu4oCZcyAoMjAwNykgc3R1ZHkgZm9jdXNlZCBwYXJ0aWNpcGFudHPigJkgYXR0ZW50aW9uIG9uIHRoZSBzaW1pbGFyaXRpZXMgYW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gY2hhcmFjdGVycywgYnkgYXNraW5nIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRvIGNvbXBhcmUgbWFueSBwYWlycyBvZiBjaGFyYWN0ZXJzIChlLmcuLCBhIGZyb2cgdnMuIGFuIGluZmFudCwgYSBkb2cgdnMuIGEgcm9ib3QpIG9uIGEgc2luZ2xlIG1lbnRhbCBjYXBhY2l0eSAoZS5nLiwgam95IGZvciBzb21lIHBhcnRpY2lwYW50cywgYW5kIHNlbGYtY29udHJvbCBmb3Igb3RoZXJzKS4gSW4gb3VyIHZpZXcsIHRoaXMgZGVzaWduIGlzIHdlbGwtc3VpdGVkIHRvIHJldmVhbCB0aGUgZGltZW5zaW9ucyBhbG9uZyB3aGljaCBzb2NpYWwgYmVpbmdzIGFyZSB0aG91Z2h0IHRvIGRpZmZlciBmcm9tIGVhY2ggb3RoZXLigJRhbiBpbXBvcnRhbnQgcGFydCBvZiBzb2NpYWwgcmVhc29uaW5nLCBidXQgbm90IGVxdWl2YWxlbnQgdG8gaW50dWl0aW9ucyBhYm91dCB0aGUgc3RydWN0dXJlIG9mIG1lbnRhbCBsaWZlIGl0c2VsZi4gCgpJbnNwaXJlZCBieSB0aGVpciBhcHByb2FjaCwgd2UgcmVjZW50bHkgY29uZHVjdGVkIGEgc2VyaWVzIG9mIHN0dWRpZXMgZGVzaWduZWQgdG8gYXNzZXNzIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5IFtYWCBhZGQgUE5BUyBjaXRhdGlvbl0uIFdlIGZvY3VzZWQgYWR1bHRz4oCZIGF0dGVudGlvbiBvbiB0aGUgY29ubmVjdGlvbnMgYW5kIGRpdmlzaW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBhc3BlY3RzIG9mIG1lbnRhbCBsaWZlIGJ5IGFza2luZyB0aGVtIHRvIGV2YWx1YXRlIGEgd2lkZSB2YXJpZXR5IG9mIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgKGUuZy4sIGEgcm9ib3Qgb3IgYSBiZWV0bGUpLiBCeSBhbmFseXppbmcgcGF0dGVybnMgb2YgYXR0cmlidXRpb25zIGFjcm9zcyBwYXJ0aWNpcGFudHMsIHdlIHVuY292ZXJlZCBhIHRocmVlLXBhcnQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdGhhdCBlbWVyZ2VkIGNvbnNpc3RlbnRseSBhY3Jvc3Mgc2V2ZXJhbCBzdHVkaWVzOiBQaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgYW5kIHNlbGYtaW5pdGlhdGVkIGJlaGF2aW9ycyBodW5nIHRvZ2V0aGVyIHRvIGZvcm0gYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gdGhlIGJvZHk7IHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIG1vcmFsIGFnZW5jeSBmb3JtZWQgYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gdGhlIGhlYXJ0OyBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIGFuZCBnb2FsIHB1cnN1aXQgZm9ybWVkIGEgc3VpdGUgb2YgY2FwYWNpdGllcyByZWxhdGVkIHRvIHRoZSBtaW5kLiBJbnRlcmVzdGluZ2x5LCBlYWNoIG9mIHRoZXNlIHRocmVlIGZhY3RvcnMgZW5jb21wYXNzZWQgYXNwZWN0cyBvZiBib3RoICJleHBlcmllbmNlIiBhbmQgImFnZW5jeS4iIEluc3RlYWQgb2YgdGhlIGJyb2FkIGRpc3RpbmN0aW9uIHRoYXQgc2VlbXMgdG8gY2hhcmFjdGVyaXplIGFkdWx0c+KAmSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzaW1pbGFyaXRpZXMgYW5kIGRpZmZlcmVuY2VzIGFtb25nIHNvY2lhbCBiZWluZ3MgKEdyYXkgZXQgYWwuLCAyMDA3KSwgYWR1bHRz4oCZIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN0cnVjdHVyZSBvZiBtZW50YWwgbGlmZSBpdHNlbGYgc2VlbXMgdG8gaGluZ2Ugb24gZGlzdGluY3Rpb25zIGFtb25nIHZhcmlldGllcyBvZiBleHBlcmllbmNlIGFuZCBhZ2VuY3ksIGFuZCBjb25uZWN0aW9ucyBhbW9uZyByZWxhdGVkIGtpbmRzIG9mIGV4cGVyaWVuY2UgYW5kIGFnZW5jeS4gVGhpcyBib2R54oCTaGVhcnTigJNtaW5kIGZyYW1ld29yayBlbWVyZ2VkIHJvYnVzdGx5IGluIGZvdXIgc3R1ZGllcyB3aXRoIFVTIGFkdWx0cywgaW5jbHVkaW5nIHN0dWRpZXMgdGhhdCBhc2tlZCBwYXJ0aWNpcGFudHMgdG8gZXZhbHVhdGUgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIG9mIG9uZSBvZiB0d28gImVkZ2UgY2FzZXMiIGluIHNvY2lhbCByZWFzb25pbmcgKGEgYmVldGxlIG9yIGEgcm9ib3QpIGFuZCBzdHVkaWVzIHRoYXQgaW5jbHVkZWQgYSB3aWRlciB2YXJpZXR5IG9mIHRhcmdldCBjaGFyYWN0ZXJzLCBmcm9tIGluZXJ0IG9iamVjdHMsIHRvIGh1bWFucywgYW5pbWFscywgYW5kIHZhcmlvdXMgdGVjaG5vbG9naWVzLgoKSGVyZSwgd2Ugc2V0IG91dCB0byBhZGFwdCB0aGUgYm90dG9tLXVwIGFwcHJvYWNoIGRldmVsb3BlZCBpbiBvdXIgcHJldmlvdXMgd29yayB3aXRoIGFkdWx0cyBbWFggYWRkIFBOQVMgY2l0YXRpb25dIHRvIGV4cGxvcmUgaW50dWl0aW9ucyBhYm91dCB0aGUgc3RydWN0dXJlIG9mIG1lbnRhbCBsaWZlIGFtb25nIGNoaWxkcmVuLiBXZSBpbmNsdWRlZCBhIHdpZGUgdmFyaWV0eSBvZiBtZW50YWwgY2FwYWNpdGllcyByZXByZXNlbnRpbmcgYWxsIGFzcGVjdHMgb2YgbWVudGFsIGxpZmXigJRmcm9tIHBlcmNlcHRpb24gYW5kIGNvZ25pdGlvbiwgdG8gc29jaWFsIGV4cGVyaWVuY2VzLCBlbW90aW9ucyBhbmQgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25z4oCUYWxsb3dpbmcgdXMgdG8gbW92ZSBiZXlvbmQgdGhlIG1vcmUgZm9jdXNlZCBleHBsb3JhdGlvbnMgb2YgY29nbml0aXZlIGFiaWxpdGllcyBpbiBwYXJ0aWN1bGFyIChGYWJyaWNpdXMgZXQgYWwuLCAxOTg5KSB0byBhIGZ1bGxlciBhY2NvdW50IG9mIGNoaWxkcmVu4oCZcyBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZS4gCgpJbiB0aGlzIHBhcGVyLCB3ZSBmaXJzdCBpbnRyb2R1Y2UgYSBjaGlsZC1mcmllbmRseSB2ZXJzaW9uIG9mIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSwgdmFsaWRhdGUgaXQgYW1vbmcgVVMgYWR1bHRzLCBhbmQgdGhlbiB1c2UgdGhpcyBwYXJhZGlnbSB0byBjb25kdWN0IGFuIGluaXRpYWwgZXhwbG9yYXRpb24gb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbmQgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhbW9uZyBVUyBjaGlsZHJlbiwgZm9jdXNpbmcgb24gNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoU3R1ZHkgMSkuIE5leHQsIHdlIHJlcGxpY2F0ZSBvdXIgZmluZGluZ3Mgd2l0aCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHVzaW5nIGEgYnJpZWZlciBleHBlcmltZW50YWwgcGFyYWRpZ20sIGFuZCB1c2UgdGhpcyBicmllZmVyIHBhcmFkaWdtIHRvIGFzc2VzcyB0aGUgZWFybGllciBkZXZlbG9wbWVudCBvZiB0aGVzZSBjb25jZXB0cywgZm9jdXNpbmcgb24gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoU3R1ZHkgMikuIEZpbmFsbHksIHdlIGludHJvZHVjZSBhbiBldmVuIHNpbXBsZXIgdmVyc2lvbiBvZiB0aGUgcGFyYWRpZ20sIHVzaW5nIG1vcmUgYmFzaWMgdm9jYWJ1bGFyeSBhbmQgYSBzdHJlYW1saW5lZCBleHBlcmltZW50YWwgcHJvdG9jb2wsIGRlc2lnbmVkIHRvIHZhbGlkYXRlIGFuZCByZWZpbmluZyBvdXIgdW5kZXJzdGFuZGluZyBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbW9uZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuLCBhcyB3ZWxsIGFzIGV4cGxvcmluZyBob3cgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBkaWZmZXJlbnQgYXNwZWN0cyBvZiBtZW50YWwgbGlmZSBtaWdodCB2YXJ5IHdpdGggYWdlIChTdHVkeSAzKS4KCiMgT3ZlcnZpZXcgb2YgTWV0aG9kcyBhbmQgQW5hbHlzZXMKClN0dWRpZXMgMS0zIHVzZWQgdmVyeSBzaW1pbGFyIGV4cGVyaW1lbnRhbCBwYXJhZGlnbXMgYW5kIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgc2FtZSBhbmFseXNlcyBpbiBtaW5kLiBIZXJlIHdlIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgdGhlIG1ldGhvZHMgYW5kIHBsYW5uZWQgYW5hbHlzZXMgZm9yIGFsbCBvZiB0aGVzZSBzdHVkaWVzOyBhbnkgZGV0YWlscyB0aGF0IHZhcmllZCBhY3Jvc3Mgc3R1ZGllcyBhcmUgc3VwcGxpZWQgaW4gdGhlICJNZXRob2RzIiBzZWN0aW9uIG9mIGVhY2ggb2YgdGhlIHN0dWRpZXMuIAoKIyMgR2VuZXJhbCBtZXRob2RzCgpGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcpLCB0aGVzZSBzdHVkaWVzIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZ29hbCBvZiBmb2N1c2luZyBwYXJ0aWNpcGFudHMnIGF0dGVudGlvbiBvbiB0aGUgc2ltaWxhcml0aWVzLCBkaWZmZXJlbmNlcywgYW5kIHJlbGF0aW9uc2hpcHMgYW1vbmcgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcy4KClRvIHRoaXMgZW5kLCBlYWNoIHBhcnRpY2lwYW50IHdhcyBlaXRoZXIgcmFuZG9tbHkgb3IgcHNldWRvLXJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyAxLTIgdGFyZ2V0IGNoYXJhY3RlcnMgKGUuZy4sIGEgYmVldGxlLCBhIHJvYm90LCBhIGdvYXQsIGV0Yy4pIG9uIGEgd2lkZSByYW5nZSBvZiBzZW5zb3J5LCBwZXJjZXB0dWFsLCBlbW90aW9uYWwsIHNvY2lhbCwgY29nbml0aXZlLCBhbmQgb3RoZXIgbWVudGFsIGNhcGFjaXRpZXMsIHJhbmdpbmcgaW4gbnVtYmVyIGZyb20gMTgtNDAgYWNyb3NzIHN0dWRpZXMgYW5kIHByZXNlbnRlZCBpbiBlaXRoZXIgYSByYW5kb20gb3IgYSBwc2V1ZG8tcmFuZG9tIChjb3VudGVyYmFsYW5jZWQpIG9yZGVyLiBQYXJ0aWNpcGFudHMgd2VyZSBwcmVzZW50ZWQgd2l0aCBhIHZpdmlkLCBmdWxsLWNvbG9yIHBob3RvZ3JhcGggb2YgdGhlaXIgYXNzaWduZWQgdGFyZ2V0IGluIGEgbmF0dXJhbGlzdGljIGNvbnRleHQgKGUuZy4sIGEgYmVldGxlIG9uIGEgbGVhZjsgYSByb2JvdCBpbiBhbiBvZmZpY2U7IGEgZ29hdCBpbiBhIGdyYXNzeSBmaWVsZCksIHdoaWNoIHRoZXkgaGFkIGFjY2VzcyB0byB0aHJvdWdob3V0IHRoZSBzdHVkeS4gCgpPbiBlYWNoIHRyaWFsLCBwYXJ0aWNpcGFudHMgd2VyZSBhc2tlZCBhIHF1ZXN0aW9uIG9mIHRoZSBmb3JtIERvIHlvdSB0aGluayBhIFt0YXJnZXRdIGNhbiBbZG8gWF0/IChlLmcuLCAiRG8geW91IHRoaW5rIGEgYmVldGxlIGNhbiBmZWVsIGhhcHB5PyI7IFN0dWRpZXMgMS0yKSBvciBDYW4gW3RhcmdldHNdIFtkbyBYXT8gKFN0dWR5IDMpIChlLmcuLCAiQ2FuIGJlZXRsZXMgZmVlbCBoYXBweT8iKS4gUGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIHRocmVlLXBvaW50IHNjYWxlIChubywgY29kZWQgYXMgMDsga2luZGEsIGNvZGVkIGFzIDAuNTsgb3IgeWVzLCBjb2RlZCBhcyAxKS4gQWx0aG91Z2ggYSB0aHJlZS1wb2ludCBzY2FsZSBpcyBub3Qgb3B0aW1hbCBmb3IgZmFjdG9yIGFuYWx5c2VzLCBwaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0aGF0IGl0IHdhcyBjcml0aWNhbCBpbiBhbGxvd2luZyBjaGlsZHJlbiB0byBtb3ZlIGZhc3QgZW5vdWdoIHRocm91Z2ggdGhlIHN0dWR5IHRvIGFuc3dlciBhbGwgcXVlc3Rpb25zLCBhbmQgbWFpbnRhaW5pbmcgdGhpcyB3aXRoaW4tc3ViamVjdHMgZGVzaWduIHdhcyBvdXIgdG9wIHByaW9yaXR5IGZvciB0aGUgcGxhbm5lZCBhbmFseXNlcy4KClNlZSB0aGUgTWV0aG9kcyBzZWN0aW9uIGZvciBlYWNoIHN0dWR5IGZvciBkZXRhaWxzIG9mIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXJzIGFuZCBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiBlYWNoIHN0dWR5LCBhcyB3ZWxsIGFzIHRoZSBtYXRlcmlhbHMgYW5kIHBoeXNpY2FsIHNldHVwLgoKIyMgRXhwbG9yaW5nIGNvbmNlcHR1YWwgc3RydWN0dXJlIHRocm91Z2ggZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpCgpPdXIgcHJpbWFyeSBnb2FsIGluIGNvbmR1Y3RpbmcgdGhlc2Ugc3R1ZGllcyB3YXMgdG8gdW5jb3ZlciBhIHNldCBvZiBsYXRlbnQgY29uc3RydWN0cyB0aGF0IG1pZ2h0IHBsYXVzaWJseSBoYXZlIGdpdmVuIHJpc2UgdG8gdGhlIG9ic2VydmVkIGNvcnJlbGF0aW9ucyBhbW9uZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGluIGVhY2ggZ3JvdXAgb2YgcGFydGljaXBhbnRzLiBBcyBzdWNoLCBvdXIgcHJpbWFyeSBwbGFubmVkIGFuYWx5c2lzIGZvciBhbGwgc3R1ZGllcyB3YXMgYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpLiBGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcpLCB3ZSBpbnRlcnByZXRlZCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzICgiZmFjdG9ycyIpIGFzIGNvcnJlc3BvbmRpbmcgdG8gYSBmdW5kYW1lbnRhbCBjb21wb25lbnQgb2YgbWVudGFsIGxpZmUsIGFjY29yZGluZyB0byB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50czsgYnkgZXh0ZW5zaW9uLCB3ZSBjb25zaWRlciB0aGUgZnVsbCBzZXQgb2YgZmFjdG9ycyBmb3IgZWFjaCBzYW1wbGUgdG8gcmVwcmVzZW50IHRvIHRoZSBvdmVyYWxsICJjb25jZXB0dWFsIHN0cnVjdHVyZSIgdW5kZXJseWluZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGZvciB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50cy4KCkZvciBhbGwgRUZBcywgd2UgdXNlZCBvcmRpbmFyeSBsZWFzdCBzcXVhcmVzIHRvIGZpbmQgdGhlIG1pbmltdW0gcmVzaWR1YWwgc29sdXRpb24sIHVzaW5nIHRoZSAicHN5Y2giIHBhY2thZ2UgZm9yIFIgKFJldmVsbGUsIDIwMTgpLiBIZXJlIHdlIGZvY3VzIG9uIHJlc3VsdHMgdXNpbmcgUGVhcnNvbiBjb3JyZWxhdGlvbnMgdXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zLiAoU2VlIE9ubGluZSBTdXBwbGVtZW50YXJ5IE1hdGVyaWFscyBbT1NNXSBmb3Igc29sdXRpb25zIHVzaW5nIHBvbHljaG9yaWMgY29ycmVsYXRpb25zLCB3aGljaCBhcmUgYmV0dGVyIHN1aXRlZCB0byBoYW5kbGUgcmVzcG9uc2VzIG9uIGEgdGhyZWUtcG9pbnQgc2NhbGUgYnV0LCB0byBvdXIgZXllcywgdGVuZGVkIHRvIG92ZXItZml0IG91ciBkYXRhIGJ5IHN1Z2dlc3RpbmcgdGhhdCB3ZSBzaG91bGQgcmV0YWluIG1hbnkgZmFjdG9ycyB0aGF0IGVhY2ggYWNjb3VudGVkIGZvciBvbmx5IGEgc21hbGwgYW1vdW50IG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UuKQoKSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluLCB3ZSBleGFtaW5lZCB0aGUgcmVzdWx0cyBvZiB0aHJlZSBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29sczogKDEpIFBhcmFsbGVsIEFuYWx5c2lzLCB3aGljaCBjb21wYXJlcyB0aGUgb2JzZXJ2ZWQgY29ycmVsYXRpb24gc3RydWN0dXJlIHRvIHRoZSBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmUgYXJpc2luZyBmcm9tIHJhbmRvbSBkYXRhc2V0cyBvZiB0aGUgc2FtZSBzaXplOyAoMikgTWluaW1pemluZyB0aGUgQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpLCB3aGljaCBpcyBvbmUgbWV0aG9kIG9mIG9wdGltaXppbmcgYm90aCBnb29kbmVzcyBvZiBmaXQgYW5kIHBhcnNpbW9ueTsgYW5kICgzKSBBIHNldCBvZiBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgcHJldmlvdXMgd29yaywgaW4gd2hpY2ggdGhleSBiZWdhbiB3aXRoIHRoZSBtYXhpbWFsIG51bWJlciBvZiBmYWN0b3JzIGFjY29yZGluZyB0byBhbiBhbmFseXNpcyBvZiBkZWdyZWVzIG9mIGZyZWVkb20sIGFuZCByZXRhaW5lZCBmYWN0b3JzIHRoYXQgbWV0IGFsbCB0aHJlZSBvZiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOiAoYSkgaGFkIGVpZ2VudmFsdWVzIGdyZWF0ZXIgdGhhbiAxLjAwLCAoYikgaW5kaXZpZHVhbGx5IGFjY291bnRlZCBmb3IgZ3JlYXRlciB0aGFuIDUlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgYmVmb3JlIHJvdGF0aW9uLCBhbmQgKGMpIHdlcmUgdGhlICJkb21pbmFudCIgZmFjdG9yICh0aGUgZmFjdG9yIHdpdGggdGhlIHN0cm9uZ2VzdCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZykgZm9yIGF0IGxlYXN0IDEgbWVudGFsIGNhcGFjaXR5IGFmdGVyIHJvdGF0aW9uLiBGb3IgZWFjaCBzdHVkeSwgb3VyIGludGVycHJldGF0aW9uIG9mIGhvdyBiZXN0IHRvIGNoYXJhY3Rlcml6ZSB0aGUgZGF0YXNldCAoaS5lLiwgaG93IG1hbnkgZmFjdG9ycyB3ZSBvYnNlcnZlKSB3YXMgZGV0ZXJtaW5lZCBieSB0aGUgZGVncmVlIG9mIGNvbnNlbnN1cyBhbW9uZyB0aGVzZSB0aHJlZSBwcm90b2NvbHMgYW5kIHRoZSBpbnRlcnByZXRhYmlsaXR5IG9mIHRoZSByZXRhaW5lZCBmYWN0b3JzIHVuZGVyIGVhY2ggcHJvdG9jb2wuIAoKSGVyZSB3ZSBmb2N1cyBvdXIgaW50ZXJwcmV0YXRpb25zIG9uIHZhcmltYXgtcm90YXRlZCBzb2x1dGlvbnMsIHdoaWNoIGNvbnN0cmFpbiBhbGwgZmFjdG9ycyB0byBiZSBvcnRob2dvbmFsLiAoU2VlIE9TTSBmb3Igc29sdXRpb25zIHVzaW5nIG9ibGlxdWUgWyJvYmxpbWluIl0gcm90YXRpb25zLCB3aGljaCBhbGxvdyBmb3IgY29ycmVsYXRlZCBmYWN0b3JzLikKCiMjIENoYXJ0aW5nIGRpZmZlcmVuY2VzIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGVzZSBjb25jZXB0cyB0aHJvdWdoIHJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZmFjdG9yIHNjb3JlcwoKSGF2aW5nIGluZmVycmVkIGEgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gZ3JvdXAgb2YgcGFydGljaXBhbnRzIHZpYSBFRkEsIHdlIHRoZW4gc291Z2h0IHRvIGV4YW1pbmUgYXR0cmlidXRpb25zIG9mIG1lbnRhbCBjYXBhY2l0aWVzIHRvIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIGVhY2ggc3R1ZHkgd2l0aGluIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmU6IFRvIHdoYXQgZXh0ZW50IGRpZCBwYXJ0aWNpcGFudHMgYXR0cmlidXRlIGVhY2ggb2YgdGhlIGZ1bmRhbWVudGFsIGNvbXBvbmVudHMgb2YgbWVudGFsIGxpZmUgcmV2ZWFsZWQgYnkgRUZBIHRvIGEgZ2l2ZW4gdGFyZ2V0IGNoYXJhY3RlciwgYW5kIGhvdyBkaWQgdGhpcyBhdHRyaWJ1dGlvbnMgdmFyeSB3aXRoIGFnZSAoZWl0aGVyIHdpdGhpbiBhbiBhZ2UgZ3JvdXAgb3IgYmV0d2VlbiBhZ2UgZ3JvdXBzKT8gCgpUbyBleHBsb3JlIHRoaXMgcXVlc3Rpb24sIGZvciBlYWNoIHN0dWR5IHdlIHByb2plY3RlZCBjaGlsZHJlbidzIGRhdGEgaW50byBhZHVsdHMnIGNvbmNlcHR1YWwgc3BhY2UgYW5kIGV4YW1pbmVkICJmYWN0b3Igc2NvcmVzIuKAlHN1bW1hcmllcyBvZiBlYWNoIHBhcnRpY2lwYW50J3MgYXR0cmlidXRpb25zIG9mIGVhY2ggb2YgZmFjdG9ycyByZXZlYWxlZCBieSBFRkEuIFdlIHVzZWQgdGhlIGNvcnJlbGF0aW9uLXByZXNlcnZpbmcgInRlbiBCZXJnZSIgbWV0aG9kIChhcyBpbXBsZW1lbnRlZCBpbiB0aGUgInBzeWNoIiBwYWNrYWdlOyBSZXZlbGxlLCAyMDE4KSwgaW1wdXRpbmcgbWlzc2luZyB2YWx1ZXMgdXNpbmcgdGhlIG1lYW4gKGJ5IHRhcmdldCBjaGFyYWN0ZXIsIGNhcGFjaXR5LCBhbmQgYWdlIGdyb3VwKS4gVGhpcyB5aWVsZGVkIG9uZSBmYWN0b3Igc2NvcmUgZm9yIGVhY2ggb2YgKGFkdWx0cycpIGZhY3RvcnMsIGZvciBlYWNoIHBhcnRpY2lwYW50LiBXZSBjb25zaWRlciB0aGVzZSB0byBiZSBzdW1tYXJpZXMgb2YgdGhhdCBwZXJzb24ncyBhdHRyaWJ1dGlvbnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbGF0ZW50IGNvbnN0cnVjdC4KCldlIGFuYWx5emVkIHRoZXNlIGZhY3RvciBzY29yZXMgdmlhIG1peGVkIGVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcyB1c2luZyB0aGUgImJybXMiIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gSW4gYWxsIG9mIHRoZXNlIGFuYWx5c2VzLCB3ZSBpbmNsdWRlZCB0aGUgbWF4aW1hbCByYW5kb20gZWZmZWN0IHN0cnVjdHVyZXMgZ2l2ZW4gdGhlIGRlc2lnbiBmb3IgdGhlIHJlbGV2YW50IHN0dWR5LiBGdXJ0aGVyIGRldGFpbHMgdmFyaWVkIGJ5IHN0dWR5LCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0YXJnZXQgY2hhcmFjdGVycyBpbmNsdWRlZCBpbiB0aGF0IHN0dWR5LCB0aGUgbnVtYmVyIG9mIGZhY3RvcnMgcmV2ZWFsZWQgYnkgRUZBIGZvciB0aGUgcmVsZXZhbnQgZ3JvdXAocykgb2YgcGFydGljaXBhbnRzLCBhbmQgdGhlIGdvYWxzIG9mIHRoZSBhbmFseXNpcyAoZS5nLiwgY29tcGFyaW5nIHR3byBhZ2UgZ3JvdXBzIHZzLiBleGFtaW5pbmcgY29udGludW91cyBlZmZlY3RzIG9mIGFnZSB3aXRoaW4gb25lIG9yIG1vcmUgZ3JvdXBzIG9mIHBhcnRpY2lwYW50cykuCgojIFN0dWR5IDEKClRoZSBnb2FsIG9mIFN0dWR5IDEgd2FzIHRvIGRldmVsb3AgYSBjaGlsZC1mcmllbmRseSB2ZXJzaW9uIG9mIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHN0dWR5IHBhcmFkaWdtIGFuZCBjb25kdWN0IGFuIGluaXRpYWwgZXhwbG9yYXRpb24gb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbW9uZyBjaGlsZHJlbi4gCgpQaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0aGF0IGNoaWxkcmVuIGFzIHlvdW5nIGFzIDcgeWVhcnMgb2YgYWdlIGZvdW5kIHRoZSBwYXJhZGlnbSBlYXN5IGFuZCBlbmpveWFibGUsIGFuZCB3b3JrIG9uIHRoZSBkZXZlbG9wbWVudCBvZiBsYXkgYmlvbG9neSBhbmQgcHN5Y2hvbG9neSBoYXMgc3VnZ2VzdGVkIHRoYXQgdGhlc2UgY29uY2VwdHMgbWF5IGNvbnRpbnVlIHRvIGRldmVsb3Agd2VsbCBpbnRvIG1pZGRsZSBjaGlsZGhvb2QgKGUuZy4sIENhcmV5LCAxOTg1OyBIYXRhbm8gJiBJbmFnYWtpLCAxOTk3OyBQaWFnZXQsIDE5Mjk7IGNmLiBHZWxtYW4gJiBPcGZlciwgMjAwMikuIFRodXMsIHdlIHRhcmdldGVkIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gZm9yIG91ciBmaXJzdCBjaGlsZCBzYW1wbGUuIFdlIGFsc28gcmVjcnVpdGVkIGEgZ3JvdXAgb2YgYWR1bHRzIHRvIHZhbGlkYXRlIG91ciBjaGlsZC0gZnJpZW5kbHkgcGFyYWRpZ20sIGkuZS4sIHRvIGV2YWx1YXRlIHdoZXRoZXIgaXQgcmVwbGljYXRlZCBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCB3b3JrIHdpdGggYWR1bHRzLgpJbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCBzdHVkaWVzLCBwYXJ0aWNpcGFudHMgZXZhbHVhdGVkIGEgdGFyZ2V0IGNoYXJhY3RlciBvbiA0MCBtZW50YWwgY2FwYWNpdGllcyB1c2luZyBhIHNldmVuLXBvaW50IExpa2VydC10eXBlIHNjYWxlLiBQaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0d28gbmVjZXNzYXJ5IG1vZGlmaWNhdGlvbnMgZm9yIGNoaWxkcmVuOiByZXdvcmRpbmcgc29tZSBvZiB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zLCBhbmQgdXNpbmcgYSBzaW1wbGVyLCB0aHJlZS1wb2ludCByZXNwb25zZSBzY2FsZSAobm8sIGtpbmRhLCBvciB5ZXM7IHNlZSAiT3ZlcnZpZXcgb2YgTWV0aG9kcyBhbmQgQW5hbHlzZXMsIGFib3ZlIikuIAoKIyMgTWV0aG9kCgojIyMgUGFydGljaXBhbnRzCgpgciBucm93KGQxX2FkX3dpZGUpICsgbnJvdyhkMV83OV93aWRlKWAgcGVvcGxlIHBhcnRpY2lwYXRlZCBpbiB0aGlzIHN0dWR5LgoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQxX2FkX2dlbmRlciA8LSBkZW1vX2Z1bihkMV9hZCwgImdlbmRlciIsIDIpCmQxX2FkX2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkMV9hZCwgImV0aG5pY2l0eV9jYXQiLCAyKQpkMV9hZF9lbmdsaXNoIDwtIGRlbW9fZnVuKGQxX2FkLCAiZW5nbGlzaE5hdGl2ZSIsIDIpCmBgYAoKQWR1bHRzIChfbl89YHIgbnJvdyhkMV9hZF93aWRlKWApIHBhcnRpY2lwYXRlZCB2aWEgQW1hem9uIE1lY2hhbmljYWwgVHVyayAoTVR1cmspIGluIEp1bHkgMjAxNi4gQWR1bHQgcGFydGljaXBhbnRzIGhhZCBnYWluZWQgYXBwcm92YWwgZm9yIGF0IGxlYXN0IDk1JSBvZiB0aGVpciBwcmV2aW91cyB3b3JrIG9uIE1UdXJrOyBoYWQgTVR1cmsgYWNjb3VudHMgYmFzZWQgaW4gdGhlIFVTOyBhbmQgaW5kaWNhdGVkIHRoYXQgdGhleSB3ZXJlIGF0IGxlYXN0IDE4IHllYXJzIG9sZC4gQWR1bHRzIHdlcmUgcGFpZCBcJDAuMzAgZm9yIGFwcHJveGltYXRlbHkgMi0zIG1pbnV0ZXMgb2YgdGhlaXIgdGltZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQxX2FkJGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYCBtaW4pLiAKCkFjY29yZGluZyB0byBzZWxmIHJlcG9ydCwgdGhlIGFkdWx0IHNhbXBsZSByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkMV9hZCRhZ2UpWyJNaW4uIl1gLWByIHN1bW1hcnkoZDFfYWQkYWdlKVsiTWF4LiJdYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQxX2FkJGFnZSlbIk1lZGlhbiJdYHkpIGFuZCB3YXMgcm91Z2hseSBzcGxpdCBiZXR3ZWVuIHdvbWVuIChgciBkMV9hZF9nZW5kZXIkcHJvcFtkMV9hZF9nZW5kZXIkZ2VuZGVyPT0iZmVtYWxlIl0gKiAxMDBgJSkgYW5kIG1lbiAoYHIgZDFfYWRfZ2VuZGVyJHByb3BbZDFfYWRfZ2VuZGVyJGdlbmRlcj09Im1hbGUiXSAqIDEwMGAlOyBgciBkMV9hZF9nZW5kZXIkcHJvcFtkMV9hZF9nZW5kZXIkZ2VuZGVyPT0ib3RoZXJfcHJlZk5vIl0gKiAxMDBgJSBvZiBwYXJ0aWNpcGFudHMgaWRlbnRpZmllZCBhcyBzb21lIG90aGVyIGdlbmRlciBvciBvcHRlZCBub3QgdG8gZGlzY2xvc2UpLiBBZHVsdHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIFdoaXRlIChgciBkMV9hZF9ldGhuaWNpdHkkcHJvcFtkMV9hZF9ldGhuaWNpdHkkZXRobmljaXR5X2NhdD09IndoaXRlIl0gKiAxMDBgJTsgYHIgZDFfYWRfZXRobmljaXR5JHByb3BbZDFfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJtdWx0aSJdICogMTAwYCUgaWRlbnRpZmllZCBhcyBtb3JlIHRoYW4gb25lIHJhY2UvZXRobmljaXR5LCBhbmQgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDFfYWRfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eV9jYXQgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHkpLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMgcmVwb3J0ZWQgRW5nbGlzaCBiZWluZyB0aGVpciBvbmx5IG5hdGl2ZSBsYW5ndWFnZSAoYHIgZDFfYWRfZW5nbGlzaCRwcm9wW2QxX2FkX2VuZ2xpc2gkZW5nbGlzaE5hdGl2ZSA9PSAieWVzX29ubHkiXSAqIDEwMGAlOyBhbiBhZGRpdGlvbmFsIGByIGQxX2FkX2VuZ2xpc2gkcHJvcFtkMV9hZF9lbmdsaXNoJGVuZ2xpc2hOYXRpdmUgPT0gInllc19tdWx0aXBsZSJdICogMTAwYCUgaW5kaWNhdGVkIHRoYXQgRW5nbGlzaCB3YXMgb25lIG9mIG11bHRpcGxlIG5hdGl2ZSBsYW5ndWFnZXMgZm9yIHRoZW0uKQoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQxXzc5X2dlbmRlciA8LSBkZW1vX2Z1bihkMV83OSwgImdlbmRlciIsIDIpCmQxXzc5X2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkMV83OSwgImV0aG5pY2l0eSIsIDIpCmQxXzc5X2JpbGluZ3VhbCA8LSBkZW1vX2Z1bihkMV83OSwgImJpbGluZ3VhbCIsIDIpCmBgYAoKQ2hpbGRyZW4gKF9uXz1gciBucm93KGQxXzc5X3dpZGUpYCkgcGFydGljaXBhdGVkIGF0IG9uZSBvZiBzZXZlcmFsIFNhbiBGcmFuY2lzY28gQmF5IEFyZWEgbXVzZXVtcyBvciBhdCB0aGVpciB5b3VuZ2VyIHNpYmxpbmcncyBwcmVzY2hvb2wgYmV0d2VlbiBKdWx5LURlY2VtYmVyIDIwMTYuIFRoZSBzdHVkeSB0b29rIG1vc3QgY2hpbGRyZW4gdW5kZXIgMTAgbWludXRlcyB0byBjb21wbGV0ZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQxXzc5JGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYCBtaW4pLiBBbiBhZGRpdGlvbmFsIDEyIGNoaWxkcmVuIHBhcnRpY2lwYXRlZCBidXQgd2VyZSBleGNsdWRlZCBmb3IgYmVpbmcgb3V0c2lkZSB0aGUgdGFyZ2V0IGFnZSByYW5nZSAoX25fPTcpLCBiZWluZyBvZiB1bmtub3duIGFnZSAoX25fPTQpLCBvciBiZWluZyBzaG93biBhIHRhcmdldCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBhIGJlZXRsZSBvciBhIHJvYm90IChfbl89MSkuIENoaWxkcmVuIHJlY2VpdmVkIGEgc21hbGwgdGhhbmsteW91IGdpZnQgKGUuZy4sIGEgc3RpY2tlcikgZm9yIHRoZWlyIHBhcnRpY2lwYXRpb24uIAoKQ2hpbGRyZW4gcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDFfNzkkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkMV83OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQxXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KS4gQWNjb3JkaW5nIHRvIHBhcmVudGFsIHJlcG9ydCwgdGhlIGNoaWxkIHNhbXBsZSBpbmNsdWRlZCBzbGlnaHRseSBtb3JlIGdpcmxzIChgciBkMV83OV9nZW5kZXIkcHJvcFtkMV83OV9nZW5kZXIkZ2VuZGVyPT0iZiJdICogMTAwYCUpIHRoYW4gYm95cyAoYHIgZDFfNzlfZ2VuZGVyJHByb3BbZDFfNzlfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlOyBgciBkMV83OV9nZW5kZXIkcHJvcFtkMV83OV9nZW5kZXIkZ2VuZGVyPT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyBnZW5kZXIgd2FzIG5vbi1iaW5hcnkgb3IgdW5rbm93bikuIFBhcmVudHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIHRoZWlyIGNoaWxkcmVuIGFzIFdoaXRlIChgciBkMV83OV9ldGhuaWNpdHkkcHJvcFtkMV83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0id2hpdGUiXSAqIDEwMGAlKSwgbXVsdGlyYWNpYWwgKGByIGQxXzc5X2V0aG5pY2l0eSRwcm9wW2QxXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJtdWx0aSJdICogMTAwYCUpLCBFYXN0IEFzaWFuIChgciBkMV83OV9ldGhuaWNpdHkkcHJvcFtkMV83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0iZWFzdCBhc2lhbiJdICogMTAwYCUpLCBvciBTb3V0aCBBc2lhbiAoYHIgZDFfNzlfZXRobmljaXR5JHByb3BbZDFfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09InNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiJdICogMTAwYCU7ICRcbGVxJCBgciBkYXRhLmZyYW1lKGQxXzc5X2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHkgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIsICJlYXN0IGFzaWFuIiwgInNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiIsICJNSVNTSU5HIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIG9mIGNoaWxkcmVuIHdlcmUgaWRlbnRpZmllZCBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHksIGFuZCBgciBkMV83OV9ldGhuaWNpdHkkcHJvcFtkMV83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyByYWNlL2V0aG5pY2l0eSB3YXMgdW5rbm93bikuIFJvdWdobHkgaGFsZiBvZiBwYXJlbnRzIChgciBkMV83OV9iaWxpbmd1YWwkcHJvcFtkMV83OV9iaWxpbmd1YWwkYmlsaW5ndWFsPT0ieWVzIl0gKiAxMDBgJSkgcmVwb3J0ZWQgdGhhdCB0aGVpciBjaGlsZCB3YXMgYmlsaW5ndWFsICh0aG91Z2gsIGFuZWNkb3RhbGx5LCBwYXJlbnRzJyBpbnRlcnByZXRhdGlvbnMgb2YgImJpbGluZ3VhbCIgcmFuZ2VkIGZyb20gdGFraW5nIGNsYXNzZXMgYXQgc2Nob29sIHRvIHNwZWFraW5nIGEgbGFuZ2F1Z2UgYXQgaG9tZSkuCgojIyMgTWF0ZXJpYWxzIGFuZCBwcm9jZWR1cmUKCkZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLiAoMjAxNywgU3R1ZGllcyAxLTMpLCBwYXJ0aWNpcGFudHMgd2VyZSByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIG9mIG9uZSBvZiB0d28gImVkZ2UgY2FzZXMiIGluIHNvY2lhbCByZWFzb25pbmc6IGEgYmVldGxlIChfbl89YHIgZDFfYWQgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gImJlZXRsZSIpICU+JSBkaXN0aW5jdChzdWJpZCkgJT4lIG5yb3coKWAgYWR1bHRzLCBfbl89YHIgZDFfNzkgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gImJlZXRsZSIpICU+JSBkaXN0aW5jdChzdWJpZCkgJT4lIG5yb3coKWAgY2hpbGRyZW4pIG9yIGEgcm9ib3QgKF9uXz1gciBkMV9hZCAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBucm93KClgIGFkdWx0cywgX25fPWByIGQxXzc5ICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JSBkaXN0aW5jdChzdWJpZCkgJT4lIG5yb3coKWAgY2hpbGRyZW4pLiBCZWNhdXNlIGJlZXRsZXMgYXJlIGFuaW1hbHMgYW5kIHJvYm90cyBhcmUgYXJ0aWZhY3RzLCB0aGlzIHBhaXIgcHJvdmlkZXMgaW5zaWdodCBpbnRvIHRoZSByb2xlIG9mIGJpb2xvZ2ljYWwgbGlmZSBpbiBhdHRyaWJ1dGlvbnMgb2YgbWVudGFsIGxpZmXigJRhbiBpc3N1ZSBvZiBwYXJ0aWN1bGFyIGludGVyZXN0IGZyb20gYSBkZXZlbG9wbWVudGFsIHBlcnNwZWN0aXZlLCBnaXZlbiB0aGUgbG9uZyBoaXN0b3J5IG9mIHdvcmsgb24gdGhlIGRldmVsb3BtZW50IG9mIHRoZSBhbmltYXRlLWluYW5pbWF0ZSBkaXN0aW5jdGlvbiBhbmQgaXRzIHJlbGF0aW9uIHRvIGZvbGsgcHN5Y2hvbG9neS4gTW9zdCBjcml0aWNhbGx5IGZvciBvdXIgYm90dG9tLXVwIGFwcHJvYWNoIHRvIHVuY292ZXJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmUsIHRoZSAibWVudGFsIGxpdmVzIiBvZiB0aGVzZSBlbnRpdGllcyBhcmUgY29udHJvdmVyc2lhbDogUGVvcGxlIGRpZmZlciBpbiB0aGVpciBhc3Nlc3NtZW50cyBvZiB0aGUgbWVudGFsIGNhcGFjaXRpZXMgb2YgYmVldGxlcyBhbmQgcm9ib3RzLiBUaGlzIGFsbG93ZWQgdXMgdG8gYWRkcmVzcyB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uOiBXaGVuIHBhcnRpY2lwYW50cyBkaXNhZ3JlZSBhYm91dCB0aGUgbWVudGFsIGNhcGFjaXRpZXMgb2Ygc29tZSBlbnRpdHksIHdoaWNoIGNhcGFjaXRpZXMgImdvIHRvZ2V0aGVyIj8KCkluc3RydWN0aW9ucyB0byBwYXJ0aWNpcGFudHMgZm9jdXNlZCBvbiB0aGUgaWRlYSB0aGF0IHdlIHdhbnRlZCB0byBrbm93IHdoYXQgcGFydGljaXBhbnRzIHRob3VnaHQgIltiZWV0bGVzL3JvYm90c10gY2FuIGRvIGFuZCBjYW4gbm90IGRvLiIgUGFydGljaXBhbnRzIHJhdGVkIHRoZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzLCBwcmVzZW50ZWQgaW4gYSByYW5kb20gb3JkZXIgZm9yIGVhY2ggcGFydGljaXBhbnQuIE9uIGVhY2ggdHJpYWwsIHBhcnRpY2lwYW50cyByZXNwb25kZWQgX25vXywgX2tpbmRhXywgb3IgX3llc18gdG8gdGhlIHF1ZXN0aW9uICJEbyB5b3UgdGhpbmsgYSBbYmVldGxlL3JvYm90XSBjYW4uLi4/IiBUaGUgdGhyZWUgcmVzcG9uc2Ugb3B0aW9ucyB3ZXJlIHZpc2libGUgdGhyb3VnaG91dCB0aGUgZXhwZXJpbWVudC4KClRoZSA0MCBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGRlc2lnbmVkIHRvIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRob3NlIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIG9yaWdpbmFsIHN0dWRpZXMsIHdoaWxlIGJlaW5nIGNvbXByZWhlbnNpYmxlIHRvIGNoaWxkcmVuIGluIGVhcmx5IGVsZW1lbnRhcnkgc2Nob29sLiBUaGlzIHNldCBvZiBpdGVtcyBpbmNsdWRlZCBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgcmVsYXRlZCB0byBiaW9sb2dpY2FsIG5lZWRzIChlLmcuLCBfZ2V0IGh1bmdyeV8pOyBlbW90aW9uYWwgZXhwZXJpZW5jZXMgKGUuZy4sIF9mZWVsIGhhcHB5Xyk7IHBlcmNlcHR1YWwgYWJpbGl0aWVzIChlLmcuLCBfaGVhciBzb3VuZHNfKTsgY29nbml0aXZlIGFiaWxpdGllcyAoZS5nLiwgX3JlbWVtYmVyIHRoaW5nc18pOyBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gYXV0b25vbXkgb3IgYWdlbmN5IChlLmcuLCBfZGVjaWRlIHdoYXQgdG8gZG9fKTsgc29jaWFsIGFiaWxpdGllcyAoZS5nLiwgX2ZlZWwgZ3VpbHR5Xyk7IGFuZCBzZXZlcmFsIGFkZGl0aW9uYWwgaXRlbXMgKGUuZy4sIF9iZSBhd2FyZSBvZiBpdHNlbGZfKS4gRWFjaCBvZiB0aGVzZSBhIHByaW9yaSBjYXRlZ29yaWVzIGluY2x1ZGVkIGF0IGxlYXN0IGZpdmUgaXRlbXMgb2YgdmFyeWluZyB2YWxlbmNlLCBjb21wbGV4aXR5LCBhbmQgcGhyYXNpbmcuIChTZWUgRmlndXJlIDEgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgbWVudGFsIGNhcGFjaXRpZXMgaW5jbHVkZWQgaW4gU3R1ZHkgMS4pCgpXZSBhbHNvIHByZXBhcmVkIGEgc2hvcnQgZGVmaW5pdGlvbiBmb3IgZWFjaCBpdGVtLCBzbyBhcyB0byBiZSBjb25zaXN0ZW50IGluIG91ciByZXNwb25zZXMgdG8gcGFydGljaXBhbnRzIChwYXJ0aWN1bGFybHkgY2hpbGRyZW4pIGlmIHRoZXkgYXNrZWQgZm9yIGNsYXJpZmljYXRpb24gKHNlZSBTT00pLiBDaGlsZHJlbiB3ZXJlIGVuY291cmFnZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3R1ZHkgdG8gYXNrIHF1ZXN0aW9ucyBpZiB0aGV5IGRpZCBub3Qga25vdyB3aGF0IGEgd29yZCBtZWFudCwgaW4gd2hpY2ggY2FzZSB0aGV5IGdpdmVuIHRoZXNlIGRlZmluaXRpb25zOyBhZHVsdHMgd2VyZSB0b2xkIHRoYXQgdGhleSBjb3VsZCBhY2Nlc3MgdGhlc2UgZGVmaW5pdGlvbnMgYnkgaG92ZXJpbmcgb3ZlciB0aGUgdGV4dCBvbiB0aGUgY29tcHV0ZXIgc2NyZWVuLiBQaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0aGF0IHNldmVuIGl0ZW1zIHJlcXVpcmVkIGNsYXJpZmljYXRpb24gZm9yIG1vc3QgY2hpbGRyZW4sIHNvIHRoZXNlIGl0ZW1zIHdlcmUgYWx3YXlzIGFjY29tcGFuaWVkIGJ5IHRoZWlyIGRlZmluaXRpb25zIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJpYWwgKGZvciBib3RoIGFkdWx0cyBhbmQgY2hpbGRyZW4pLCBhcyBmb2xsb3dzOiBfaGF2ZSBhIHBlcnNvbmFsaXR5LCBsaWtlIHdoZW4gc29tZW9uZSBpcyBzaHkgYW5kIHNvbWVib2R5IGVsc2UgaXMgc2lsbHlfOyBfaGF2ZSBiZWxpZWZzLCBsaWtlIHdoZW4geW91IHRoaW5rIHNvbWV0aGluZyBpcyB0cnVlXzsgX2ZlZWwgcGxlYXN1cmUsIGxpa2Ugd2hlbiBzb21ldGhpbmcgZmVlbHMgcmVhbGx5IGdvb2RfOyBfaGF2ZSBkZXNpcmVzLCBsaWtlIHdoZW4geW91IHJlYWxseSB3YW50IHNvbWV0aGluZ187IF9oYXZlIHNlbGYtIGNvbnRyb2wsIGxpa2Ugd2hlbiB5b3Ugc3RvcCB5b3Vyc2VsZiBmcm9tIGRvaW5nIHNvbWV0aGluZyB5b3Ugc2hvdWxkbid0IGRvXzsgX2hhdmUgZ29hbHMsIGxpa2Ugd2hlbiB5b3UncmUgdHJ5aW5nIGhhcmQgdG8gZG8gc29tZXRoaW5nIG9yIG1ha2Ugc29tZXRoaW5nIGhhcHBlbl87IGFuZCBfZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdGhyb3cgdXBfLiAKCkFkdWx0cyBjb21wbGV0ZWQgdGhlIHN0dWR5IGJ5IGNsaWNraW5nIHRocm91Z2ggYSB3ZWJzaXRlIGF0IHRoZWlyIG93biBwYWNlLCB3aXRoIG9uZSB0cmlhbCBwcmVzZW50ZWQgb24gZWFjaCBwYWdlIGFuZCBubyBhYmlsaXR5IHRvIGdvIGJhY2t3YXJkcy4gQ2hpbGRyZW4gY29tcGxldGVkIHRoZSBzdHVkeSBvbiBhbiBleHBlcmltZW50ZXIncyBsYXB0b3AgY29tcHV0ZXIuIFRoZSBleHBlcmltZW50ZXIgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgZmlyc3Qgc2V2ZXJhbCB0cmlhbHMgb3V0IGxvdWQsIHJlcXVlc3RpbmcgdmVyYmFsIHJlc3BvbnNlcyBmcm9tIHRoZSBjaGlsZCBhbmQgc2VsZWN0ZWQgaGlzIG9yIGhlciByZXNwb25zZSBmb3IgaGVyOyBhZnRlciBzZXZlcmFsIHRyaWFscywgdGhlIGV4cGVyaW1lbnRlciBnYXZlIHRoZSBjaGlsZCB0aGUgb3B0aW9uIHRvIGNvbnRpbnVlIGluZGVwZW5kZW50bHkgKHJlYWRpbmcgdGhlIHF1ZXN0aW9ucyBhbmQgc2VsZWN0aW5nIHRoZWlyIGFuc3dlcnMgdGhlbXNlbHZlcykgaWYgdGhleSBkZXNpcmVkLiBSb3VnaGx5IGhhbGYgb2YgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0YXNrIGluZGVwZW5kZW50bHkuCgojIyMgRGF0YSBwcm9jZXNzaW5nCgpXZSBkcm9wcGVkIHRyaWFscyB3aXRoIHJlc3BvbnNlIHRpbWVzIHRoYXQgd2VyZSBmYXN0ZXIgdGhhbiBhIHByZXNldCBjcml0ZXJpb24gb2YgMjUwbXMgKF9uXz0zIGNoaWxkIHRyaWFscywgX25fPTk3IGFkdWx0IHRyaWFscykgYW5kIHJldGFpbmVkIHBhcnRpY2lwYW50cyByZWdhcmRsZXNzIG9mIHNraXBwZWQgdHJpYWxzIChfbl89NTUgY2hpbGQgdHJpYWxzLCBfbl89MSBhZHVsdCB0cmlhbCkuIE92ZXJhbGwsIG9ubHkgMSUgb2YgYWR1bHQgdHJpYWxzIGFuZCAxJSBvZiBjaGlsZCB0cmlhbHMgd2VyZSBtaXNzaW5nIGRhdGE7IGluIHRoZXNlIGNhc2VzLCB3ZSBpbXB1dGVkIG1pc3NpbmcgdmFsdWVzIHVzaW5nIHRoZSBtZWRpYW4gYnkgdGFyZ2V0IGNoYXJhY3RlciwgY2FwYWNpdHksIGFuZCBhZ2UgZ3JvdXAuCgojIyBSZXN1bHRzCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IEFkdWx0cwoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QxX2FkIDwtIGZhLnBhcmFsbGVsKGQxX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJG5mYWN0Cm5mYWN0X2JpY19kMV9hZCA8LSB2c3MoZDFfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kMV9hZCA8LSByZXRlbl9mdW4oZDFfYWRfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDFfYWQsCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QxX2FkLAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kMV9hZCkKYGBgCgpgYGB7cn0KZWZhXzRfZDFfYWQgPC0gZmFfZnVuKGQxX2FkX3dpZGVfaSwgNCkKCmBgYAoKVHdvIG9mIG91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiAobWluaW1pemluZyBCSUMgYW5kIFdlaXNtYW4gZXQgYWwuJ3MgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSkgc3VnZ2VzdGVkIHJldGFpbmluZyB0aHJlZSBmYWN0b3JzLiAoUGFyYWxsZWwgYW5hbHlzaXMgc3VnZ2VzdGVkIHJldGFpbmluZyBmb3VyIGZhY3RvcnMuIFRocmVlIG9mIHRoZXNlIGZhY3RvcnMgd2VyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHRocmVlIGZhY3RvcnMgcmVwb3J0ZWQgYmVsb3csIGFuZCB0aGUgZm91cnRoIGZhY3RvciB3YXMgZG9taW5hbnQgZm9yIGEgaGFuZGZ1bCBvZiBzZW5zb3J5IGFuZCBwZXJjZXB0dWFsIGNhcGFjaXRpZXMsIGluY2x1ZGluZyBgciB0b3Bfbl9kb21DYXAoZWZhXzRfZDFfYWQsIDQsICJGNCIsICJwb3MiKWA7IHNlZSBTT00uKQoKYGBge3J9CmVmYV8zX2QxX2FkIDwtIGZhX2Z1bihkMV9hZF93aWRlX2ksIDMpCmVmYV8zX3Bsb3RfZDFfYWQgPC0gaGVhdG1hcF9mdW4oZWZhXzNfZDFfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkhFQVJUIiwgIkJPRFkiLCAiTUlORCIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQWR1bHRzIChuPSIsIG5yb3coZDFfYWRfd2lkZV9pKSwgIikiKSkKYGBgCgpBZnRlciByb3RhdGlvbiwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIGNhcGFjaXRpZXMgZm9yIHNlbGYtIGFuZCBvdGhlci1yZWxldmFudCBlbW90aW9uc+KAlGEgc3VpdGUgb2YgY2FwYWNpdGllcyB0aGF0IHdlIChmb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4pIHdpbGwgcmVmZXIgdG8gYXMgX0hFQVJUXy4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxX2FkLCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLgoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgcmVsYXRlZCB0byBiaW9sb2dpY2FsIG5lZWRz4oCUYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHRoYXQgd2UgKGZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLikgd2lsbCByZWZlciB0byBhcyBfQk9EWV8uIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV9hZCwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgdGhpcmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIHRvIGRldGVjdCBhbmQgdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnZpcm9ubWVudOKAlGEgc3VpdGUgb2YgY2FwYWNpdGllcyB0aGF0IHdlIChmb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4pIHdpbGwgcmVmZXIgdG8gYXMgX01JTkRfLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfYWQsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uICAKClNlZSBGaWd1cmUgMSBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncy4gKE5vdGUgdGhhdCBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kgYWNyb3NzIHN0dWRpZXMgYW5kIGNvbXBhcmlzb24gd2l0aCBXZWlzbWFuIGV0IGFsLidzIHdvcmssIHdlIGhhdmUgcGxvdHRlZCB0aGVzZSBmYWN0b3JzIGluIHRoZSBzYW1lIG9yZGVyIGZvciBhbGwgc3R1ZGllczogX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfLikKCkluIHN1bSwgYXMgV2Vpc21hbiBldCBhbC4ncyBvcmlnaW5hbCBzdHVkaWVzLCBhIHRocmVlLWZhY3RvciBzdHJ1Y3R1cmUgZW1lcmdlZCBmcm9tIGFkdWx0cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucywgY2hhcmFjdGVyaXplZCBieSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYm9keSwgaGVhcnQsIGFuZCBtaW5kLiBUaGlzIHN1Z2dlc3RzIHRoYXQgb3VyIGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtIHdhcyB2YWxpZDogVXNpbmcgcmV3b3JkZWQgaXRlbXMgYW5kIGEgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgZWxpY2l0ZWQgdGhlIHNhbWUgaW50dWl0aXZlIG9udG9sb2d5IG9mIG1lbnRhbCBsaWZlLCBhbW9uZyBhZHVsdHMsIHRoYXQgaGFzIGJlZW4gcmV2ZWFsZWQgYnkgbW9yZSBjb21wbGV4LCAiYWR1bHQtZnJpZW5kbHkiIGV4cGVyaW1lbnRhbCBwYXJhZGlnbXMuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBDaGlsZHJlbiAoNy05eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMV83OSA8LSBmYS5wYXJhbGxlbChkMV83OV93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSRuZmFjdApuZmFjdF9iaWNfZDFfNzkgPC0gdnNzKGQxXzc5X3dpZGVfaSwgY29yID0gY2hvc2VuX2Nvciwgcm90YXRlID0gY2hvc2VuX3JvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSR2c3Muc3RhdHMkQklDICU+JSB3aGljaC5taW4oKQpuZmFjdF93ZG1fZDFfNzkgPC0gcmV0ZW5fZnVuKGQxXzc5X3dpZGVfaSwgcm90X3R5cGUgPSBjaG9zZW5fcm90KQoKY2F0KCJQYXJhbGxlbCBhbmFseXNpczogIiwgbmZhY3RfcGFyX2QxXzc5LAogICAgIlxuTWluaW1pemluZyBCSUM6ICIsIG5mYWN0X2JpY19kMV83OSwKICAgICJcbldlaXNtYW4gZXQgYWwuOiAiLCBuZmFjdF93ZG1fZDFfNzkpCmBgYAoKT3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIGFsbCBzdWdnZXN0ZWQgcmV0YWluaW5nIHRocmVlIGZhY3RvcnMuCgpgYGB7cn0KZWZhXzNfZDFfNzkgPC0gZmFfZnVuKGQxXzc5X3dpZGVfaSwgMykKCmVmYV8zX3Bsb3RfZDFfNzkgPC0gaGVhdG1hcF9mdW4oZWZhXzNfZDFfNzksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkhFQVJUIiwgIkJPRFkiLCAiTUlORCIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQ2hpbGRyZW4gNy05eSAobj0iLCBucm93KGQxXzc5X3dpZGVfaSksICIpIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KY29uZ19lZmFfM19kMV9hZF83OSA8LSBmYS5jb25ncnVlbmNlKGVmYV8zX2QxXzc5JGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhXzNfZDFfYWQkbG9hZGluZ3MpCmBgYAoKQWZ0ZXIgcm90YXRpb24sIHRoZSBmaXJzdCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9IRUFSVF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYxIiwgIkYxIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV83OSwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgc2Vjb25kIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMiIsICJGMiJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMiIsICJGMSJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYyIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxXzc5LCA0LCAiRjIiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSB0aGlyZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjMiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjMiLCAiRjEiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMyIsICJGMiJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV83OSwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgMSBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncy4pCgpJbiBzdW0sIGxpa2UgYWR1bHRzLCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgd2VyZSBkb21pbmF0ZWQgYnkgYSB0aHJlZS13YXkgZGlzdGluY3Rpb24gYmV0d2VlbiBwaHlzaW9sb2dpY2FsLCBzb2NpYWwtZW1vdGlvbmFsLCBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVz4oCUaS5lLiwgYm9keSwgaGVhcnQsIGFuZCBtaW5kLgoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC42N30KZmlnMDFfcGxvdHMgPC0gcGxvdF9ncmlkKGVmYV8zX3Bsb3RfZDFfNzksIGVmYV8zX3Bsb3RfZDFfYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygwLjg1LCAxKSwgbGFiZWxzID0gYygiQSIsICJCIikpCmZpZzAxX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzAxX3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDE6IEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyByZXN1bHRzIGZvciA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIChBKSBhbmQgYWR1bHRzIChCKSBpbiBTdHVkeSAxLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzOiBhIGJlZXRsZSBvciBhIHJvYm90LiIsIDE0MyksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwMV93aXRoX2NhcHRpb24pCmBgYAoKIyMjIEF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZQoKVGhlIGZhY3RvciBhbmFseXNlcyBvZiBjb3JyZWxhdGlvbnMgYW1vbmcgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBqdXN0IGRlc2NyaWJlZCBzaGVkIGxpZ2h0IG9uIG9uZSBhc3BlY3Qgb2YgY2hpbGRyZW4ncyBjb25jZXB0cyBvZiBtZW50YWwgbGlmZTogaXRzIG9udG9sb2dpY2FsIHN0cnVjdHVyZS4gVGhlIGRlc2lnbiBvZiBvdXIgc3R1ZHkgYWxzbyBhbGxvd3MgdXMgdG8gbG9vayBhdCBhIHNlY29uZCBhc3BlY3Qgb2YgY29uY2VwdHVhbCBkZXZlbG9wbWVudCBpbiB0aGlzIGRvbWFpbjogY2hpbGRyZW4ncyBhcHBsaWNhdGlvbiBvZiB0aGlzIGNvbmNlcHQsIGkuZS4sIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzIHRoZXkgdGVuZCB0byBhdHRyaWJ1dGUgb3Igbm90IHRvIGF0dHJpYnV0ZSB0byB0aGUgZGlmZmVyZW50IHRhcmdldCBjaGFyYWN0ZXJzLiBIb3cgbWlnaHQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY2FwYWNpdGllcyByZWxhdGVkIHRvIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyB2YXJ5IGFjcm9zcyBtaWRkbGUgY2hpbGRob29kICg3LTl5KSwgYW5kIGhvdyBkbyB0aGV5IGNvbXBhcmUgdG8gdGhlIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgb2YgYWR1bHRzPwoKIyMjIyBDaGlsZHJlbiB2cy4gYWR1bHRzCgpgYGB7cn0KZDFfYWxsX3dpZGVfaSA8LSBkMV9hZF93aWRlX2kgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF9jaGFyIikgJT4lCiAgZnVsbF9qb2luKGQxXzc5X3dpZGVfaSAlPiUKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZF9jaGFyIikKYGBgCgpgYGB7cn0KZWZhXzNfZDFfNzlfcHJvamVjdF9zY29yZXMgPC0gcHJlZGljdChvYmplY3QgPSBlZmFfM19kMV9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZDFfNzlfd2lkZV9pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5kYXRhID0gZDFfYWRfd2lkZV9pKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF9jaGFyIikgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiXy4qJCIsICIiLCBzdWJpZF9jaGFyKSwKICAgICAgICAgY2hhcmFjdGVyID0gZ3N1YigiXi4qXyIsICIiLCBzdWJpZF9jaGFyKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIC1jKHN1YmlkLCBjaGFyYWN0ZXIsIHN1YmlkX2NoYXIpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpKSAlPiUKICBhcnJhbmdlKHN1YmlkX2NoYXIpCmBgYAoKVG8gY29tcGFyZSBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgdG8gdGhvc2Ugb2YgYWR1bHRzLCB3ZSBwcm9qZWN0ZWQgY2hpbGRyZW4ncyByZXNwb25zZXMgaW50byB0aGUgZmFjdG9yIHNwYWNlIGRlZmluZWQgYnkgYWR1bHRzIChzdGFuZGFyZGl6ZWQgaW4gdGVybXMgb2YgYWR1bHRzJyByZXNwb25zZXMpLCBhbmQgZXhhbWluZWQgZmFjdG9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAgKHVzaW5nIHRoZSBjb3JyZWxhdGlvbi1wcmVzZXJ2aW5nIG1ldGhvZCBhcnRpY3VsYXRlZCBieSB0ZW4gQmVyZ2UsIEtyaWpuZW4sIFdhbnNiZWVrLCAmIFNoYXBpcm8sIDE5OTksIGFzIGltcGxlbWVudGVkIGluIHRoZSAicHN5Y2giIHBhY2thZ2UgZm9yIFIsIFJldmVsbGUsIDIwMTgpLiBUaGlzIHlpZWxkZWQgdGhyZWUgc2NvcmVzIGZvciBlYWNoIHBhcnRpY2lwYW50LCBjb3JyZXNwb25kaW5nLCBpbiBwcmluY2lwbGUsIHRvIGhvbGlzdGljIGp1ZGdtZW50cyBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCwgcGh5c2lvbG9naWNhbCwgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlciB0aGUgcGFydGljaXBhbnQgZXZhbHVhdGVkLiAoTm90ZSB0aGF0IGVhY2ggb2YgdGhlc2UgdGhyZWUgc2NvcmVzIHRha2VzIGludG8gYWNjb3VudCBmYWN0b3IgbG9hZGluZ3MgZm9yIGFsbCA0MCBtZW50YWwgY2FwYWNpdGllcywgYXMgc2hvd24gaW4gRmlndXJlIDEuKSAKClRoaXMgYWxsb3dlZCB1cyB0byBleGFtaW5lIHRoZSBlZmZlY3RzIG9mIGFnZSBncm91cCAoYWR1bHQsIGNoaWxkKSwgY2hhcmFjdGVyIChiZWV0bGUsIHJvYm90KSwgYW5kIGZhY3RvciAoX0JPRFlfLCBfSEVBUlRfLCBfTUlORF8pIG9uIHRoZXNlIHNjb3JlcyB2aWEgbWl4ZWQgZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uLiBTZWUgVGFibGUgMSBmb3IgdGhlIHJlc3VsdHMgb2YgYSBtYXhpbWFsIG1vZGVsIGFuZCBGaWd1cmUgNCBmb3Igc2NvcmVzIGJ5IGFnZSBncm91cCwgYWdlIChmb3IgY2hpbGRyZW4pLCBmYWN0b3IsIGFuZCBjaGFyYWN0ZXIuIAoKYGBge3J9CmVmYV8zX3Njb3Jlc19kMV9hbGwgPC0gZWZhXzNfZDFfYWQkc2NvcmVzICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXN1YmlkX2NoYXIpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIl9iZWV0bGUiLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX3JvYm90IiwgIiIsIHN1YmlkKSwKICAgICAgICAgY2hhcmFjdGVyID0gZ3N1YigiXi4qXyIsICIiLCBzdWJpZF9jaGFyKSwKICAgICAgICAgYWdlX2dyb3VwID0gImFkdWx0cyIsCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKGVmYV8zX2QxXzc5X3Byb2plY3Rfc2NvcmVzICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDFfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2VfZ3JvdXAsIGFnZSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIiksIGNoYXJhY3RlciwgYWdlX2dyb3VwKSwgZnVucyhmYWN0b3IpKQoKZWZhXzNfc2NvcmVzX2Jvb3RfZDFfYWxsIDwtIGVmYV8zX3Njb3Jlc19kMV9hbGwgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBmYWN0b3IsIGZhY3Rvcl9uYW1lLCBjaGFyYWN0ZXIpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDFfYWxsJGNoYXJhY3RlcikgPC0gY2JpbmQoIlJfR00iID0gYygtMSwgMSkpCmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDFfYWxsJGFnZV9ncm91cCkgPC0gY2JpbmQoIkNINzlfQUQiID0gYygwLCAxKSkKY29udHJhc3RzKGVmYV8zX3Njb3Jlc19kMV9hbGwkZmFjdG9yX25hbWUpIDwtIGNiaW5kKCJIX0dNIiA9IGMoLTEsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1fR00iID0gYygtMSwgMCwgMSkpCgojIGVmYV8zX3Njb3Jlc19yX2QxX2FsbCA8LSBicm0oc2NvcmUgfiBmYWN0b3JfbmFtZSAqIGFnZV9ncm91cCAqIGNoYXJhY3RlcgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMXxzdWJpZCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZWZhXzNfc2NvcmVzX2QxX2FsbCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMjM0NSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gNCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSkpCiMgc2F2ZVJEUyhlZmFfM19zY29yZXNfcl9kMV9hbGwsIGZpbGUgPSAiLi9icm1zX21vZGVscy9lZmFfM19zY29yZXNfcl9kMV9hbGwucmRzIikKCmVmYV8zX3Njb3Jlc19yX2QxX2FsbCA8LSByZWFkUkRTKCIuL2JybXNfbW9kZWxzL2VmYV8zX3Njb3Jlc19yX2QxX2FsbC5yZHMiKQojIHN1bW1hcnkoZWZhXzNfc2NvcmVzX3JfZDFfYWxsKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgcmVzdWx0cyA9ICJhc2lzIn0KZml4ZWYoZWZhXzNfc2NvcmVzX3JfZDFfYWxsKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKICBtdXRhdGUoUGFyYW1ldGVyID0gcmVjb2RlX2ZhY3RvcihQYXJhbWV0ZXIsCiAgICAiSW50ZXJjZXB0IiA9ICIoSW50ZXJjZXB0KSIsCiAgICAiY2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIChyb2JvdCB2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTSIgPSAiSEVBUlQgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgSEVBUlQiLAogICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgTUlORCIsCiAgICAiYWdlX2dyb3VwQ0g3OV9BRCIgPSAiYWdlIGdyb3VwIChjaGlsZHJlbiB2cy4gYWR1bHRzKSIsCiAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgYWdlIGdyb3VwIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiTUlORCDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIMOXIGFnZSBncm91cCIpKSAlPiUKICBhcnJhbmdlKFBhcmFtZXRlcikgJT4lCiAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQogIHVuaXRlKGA5NSUgQ0lgLCBRMi41LCBROTcuNSwgc2VwID0gIiwgIikgJT4lCiAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSAxOiBGaXhlZCBlZmZlY3RzIGZyb20gYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gbW9kZWwgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDEgYnkgY2hhcmFjdGVyIChiZWV0bGUsIHJvYm90KSwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBhZ2UgZ3JvdXAgKGFkdWx0cywgY2hpbGRyZW4pLiBUaGUgbW9kZWwgdXNlZCB0aGUgZm9ybXVsYSAnZmFjdG9yIHNjb3JlIH4gZmFjdG9yICogYWdlIGdyb3VwICogY2hhcmFjdGVyICsgKDEgfCBzdWJqZWN0KScgYW5kIHdhcyBpbXBsZW1lbnRlZCBpbiB0aGUgJ2JybXMnIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gRmFjdG9yIGFuZCBjaGFyYWN0ZXIgd2VyZSBlZmZlY3QtY29kZWQ7IGFnZSBncm91cCB3YXMgZHVtbXktY29kZWQgd2l0aCBhZHVsdHMgYXMgdGhlIGJhc2VsaW5lLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkFkdWx0cyIsIDEsIDYpICU+JQogIGdyb3VwX3Jvd3MoIjctOXkgdnMuIGFkdWx0cyIsIDcsIDEyKQpgYGAKCkNvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMsIGZhY3RvciBzY29yZXMgc3VnZ2VzdCB0aGF0IGFkdWx0cyBnZW5lcmFsbHkgYXR0cmlidXRlZCBmZXdlciBtZW50YWwgY2FwYWNpdGllcyB0byB0aGUgcm9ib3QgdGhhbiB0aGUgYmVldGxlIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImNoYXJhY3RlclJfR00iKWApLiBIb3dldmVyLCB0aGlzIGFwcGVhcnMgdG8gYmUgZW50aXJlbHkgZHVlIHRvIHRoZSBodWdlIGRpc2NyZXBhbmN5IGJldHdlZW4gY2hhcmFjdGVycyBpbiB0aGUgX0JPRFlfIGRvbWFpbjsgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGFyYWN0ZXJzIHdhcyByZWR1Y2VkIHRvIG5vdGhpbmcgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJSX0dNIilgKSwgYW5kIHJldmVyc2VkIGluIHRoZSBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iKWApLiAKCk1lYW53aGlsZSwgY2hpbGRyZW4gdGVuZGVkIHRvIGF0dHJpYnV0ZSBtb3JlIG1lbnRhbCBjYXBhY2l0aWVzLCBjb2xsYXBzaW5nIGFjcm9zcyBjaGFyYWN0ZXJzLCB0aGFuIGRpZCBhZHVsdHMgKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiYWdlX2dyb3VwQ0g3OV9BRCIpYCkgLSBidXQgdGhpcyB3YXMgZHJpdmVuIHByaW1hcmlseSBieSB0aGUgc29jaWFsLWVtb3Rpb25hbCBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQiKWApLCBhbmQgd2FzIHJldmVyc2VkIGluIHRoZSBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQiKWApLiAKCmBgYHtyLCBmaWcud2lkdGggPSAyLCBmaWcuYXNwID0gM30KZmlnMDJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2Jvb3RfZDFfYWxsICU+JQogICAgICAgICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjc5IiA9ICI3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIikpLAogICAgICAgYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBtZWFuLCBjb2xvciA9IGNoYXJhY3RlcikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3Rvcl9uYW1lKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjaGFyYWN0ZXIpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEwLCAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBGKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gIiIsIGNvbG9yID0gImNoYXJhY3RlciIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KZmlnMDJfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDJfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSAyOiBGYWN0b3Igc2NvcmVzIGZvciBhZHVsdHMgYW5kIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgY2hhcmFjdGVyczogYSBiZWV0bGUgKHBpbmsgY2lyY2xlcykgb3IgYSByb2JvdCAoYmx1ZSBzcXVhcmVzKS4gRWFjaCBwYXJ0aWNpcGFudCByZWNpZXZlZCBhIGZhY3RvciBzY29yZSBmb3IgZWFjaCBmYWN0b3IgKEJPRFksIEhFQVJULCBhbmQgTUlORCwgYXMgZGVmaW5lZCBieSBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMpLiBXZSB0cmVhdGVkIHRoZXNlIHNjb3JlcyBhcyBzdW1tYXJpZXMgb2YgdGhhdCBwYXJ0aWNpcGFudHMnIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgaW4gdGhlc2UgZG9tYWluczsgYSBzY29yZSBvZiAwIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWFuIGZvciB0aGF0IGZhY3RvciBhbW9uZyBhZHVsdHMuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgdGhlIHktYXhpcyBkaWZmZXJzIGFjcm9zcyBwYW5lbHMuIiwgNjIpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnMDJfd2l0aF9jYXB0aW9uKQpgYGAKCkEgdmlzdWFsIGluc3BlY3Rpb24gb2YgRmlndXJlIDIgY2xhcmlmaWVzIHRoZXNlIGZpbmRpbmdzLiBBdHRyaWJ1dGlvbnMgaW4gdGhlIF9CT0RZXyBhbmQgX01JTkRfIGRvbWFpbnMgd2VyZSByYXRoZXIgc2ltaWxhciBmb3IgY2hpbGRyZW4gYW5kIGFkdWx0czogQm90aCBjaGlsZHJlbiBhbmQgYWR1bHRzIG1hcmtlZCBhIGNsZWFyIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9ib3QgYW5kIHRoZSBiZWV0bGUgaW4gdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgX0JPRFlfICh0b3Agcm93KSwgaW4gbGluZSB3aXRoIHRoZSBhbmltYXRl4oCTaW5hbmltYXRlIGRpc3RpbmN0aW9uOyBhbmQgYm90aCBhZ2UgZ3JvdXBzIGNyZWRpdGVkIHRoZSByb2JvdCB3aXRoIHNsaWdodGx5IGdyZWF0ZXIgcGVyY2VwdHVhbC1jb2duaXRpdmUgc2tpbGxzIChfTUlORF8pIHRoYW4gdGhlIGJlZXRsZSAoYm90dG9tIHJvdykuIEluIGNvbnRyYXN0LCBpbiB0aGUgX0hFQVJUXyBkb21haW4gKG1pZGRsZSByb3cpIGJvdGggdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90IHJlY2VpdmVkIHJhdGhlciBsb3cgc2NvcmVzIGFtb25nIGFkdWx0cywgYnV0IHZlcnkgaGlnaCBzY29yZXMgYW1vbmcgY2hpbGRyZW4uCgpUaGUgcmF3IGRhdGEgZnVydGhlciBzdXBwb3JzdCB0aGVzZSBvYnNlcnZhdGlvbnM7IHNlZSBGaWd1cmUgMyBmb3IgcmF3IGNvdW50cyBvZiBfbm9fLCBfa2luZGFfLCBhbmQgX3llc18gcmVzcG9uc2VzIGZvciBhbGwgaXRlbXMsIGdyb3VwZWQgYnkgZmFjdG9yLCBjaGFyYWN0ZXIsIGFuZCBhZ2UgZ3JvdXAuIEZvciBleGFtcGxlLCBjb25zaWRlciBodW5nZXIgKHRoZSBmaXJzdCBjYXBhY2l0eSB1bmRlciBfQk9EWV8pOiBBY3Jvc3MgYWdlIGdyb3VwcywgbmVhcmx5IGV2ZXJ5IHBhcnRpY2lwYW50IHNhaWQgdGhhdCBhIGJlZXRsZSBjb3VsZCBnZXQgaHVuZ3J5LCB3aGlsZSBmZXcgcGFydGljaXBhbnRzICh3aXRoIHRoZSBleGNlcHRpb24gb2Ygc29tZSBjaGlsZHJlbikgc2FpZCB0aGF0IGEgcm9ib3QgY291bGQuIExpa2V3aXNlLCBmb3IgbWF0aGVtYXRpY2FsIGNvbXB1dGF0aW9ucyAodGhlIGxhc3QgY2FwYWNpdHkgdW5kZXIgX01JTkRfKSwgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBzYWlkIHRoYXQgYSBiZWV0bGUgd2FzIGNhcGFibGUgb2YgZG9pbmcgbWF0aCwgd2hpbGUgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYm90aCBhZHVsdHMgYW5kIGNoaWxkcmVuIHNhaWQgdGhhdCBhIHJvYm90IHdhcy4gQnV0IGZvciBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcywgbGlrZSBmZWVsaW5nIHByb3VkLCBmZWVsaW5nIGpveSwgYW5kIGZlZWxpbmcgc2FkICh0aGUgZmlyc3QgdGhyZWUgY2FwYWNpdGllcyB1bmRlciBfSEVBUlRfKSwgZmFyIG1vcmUgY2hpbGRyZW4gdGhhbiBhZHVsdHMgZW5kb3JzZWQgdGhlc2UgY2FwYWNpdGllcyBmb3IgYmVldGxlcyBhbmQgcm9ib3RzLiAoU2VlIFNPTSBmb3IgYW4gYW5hbHlzaXMsIHBhcmFsbGVsIHRvIHRoZSByZWdyZXNzaW9uIGFuYWx5c2VzIGhlcmUsIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3AtbG9hZGluZyBtZW50YWwgY2FwYWNpdGllcyBmb3IgZWFjaCBmYWN0b3IgdGhhdCB3ZXJlIGVuZG9yc2VkIGJ5IHBhcnRpY2lwYW50cyBvZiBkaWZmZXJlbnQgYWdlcy4pCgpgYGB7cn0KZDFfYWxsIDwtIGQxX2FkICU+JQogIGZ1bGxfam9pbihkMV83OSkgJT4lCiAgc2VsZWN0KGFnZV9ncm91cCwgc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlX251bSkgJT4lCiAgbGVmdF9qb2luKGxvYWRpbmdzX2Z1bihlZmFfM19kMV9hZCkgJT4lIAogICAgICAgICAgICAgIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICB0b3BfbigxLCBsb2FkaW5nKSAlPiUKICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgYXJyYW5nZShmYWN0b3IsIGRlc2MobG9hZGluZykpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6NDApICU+JQogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgZmFjdG9yLCBvcmRlcikpICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2VfbnVtKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gcmVjb2RlX2ZhY3RvcihyZXNwb25zZV9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuNSIgPSAia2luZGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gInllcyIpLAogICAgICAgICBmYWN0b3IgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpLAogICAgICAgICBhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiY2hpbGRyZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSkKYGBgCgpgYGB7cn0KZmlnMDNfZnVuIDwtIGZ1bmN0aW9uKHdoaWNoZmFjKXsKICBmaWcgPC0gZDFfYWxsICU+JQogICAgZmlsdGVyKGZhY3RvciA9PSB3aGljaGZhYykgJT4lCiAgICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW4iID0gIjctOXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIikpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjYXBhY2l0eSwgb3JkZXIpLAogICAgICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLCBhbHBoYSA9IHJlc3BvbnNlKSkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhjaGFyYWN0ZXIpLCByb3dzID0gdmFycyhhZ2VfZ3JvdXApLAogICAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICAgIGxhYnModGl0bGUgPSB3aGljaGZhYywKICAgICAgICAgeCA9ICJtZW50YWwgY2FwYWNpdHkgKGJ5IGZhY3RvcikiLAogICAgICAgICB5ID0gInByb3BvcnRpb24gb2YgcGFydGljaXBhbnRzIikKICAKICBpZih3aGljaGZhYyAhPSAiTUlORCIpewogICAgZmlnIDwtIGZpZyArIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikgKyBsYWJzKHggPSAiIikKICB9CiAgCiAgcmV0dXJuKGZpZykKfQoKZmlnMDNfQk9EWV9wbG90IDwtIGZpZzAzX2Z1bigiQk9EWSIpCmZpZzAzX0hFQVJUX3Bsb3QgPC0gZmlnMDNfZnVuKCJIRUFSVCIpCmZpZzAzX01JTkRfcGxvdCA8LSBmaWcwM19mdW4oIk1JTkQiKQoKZmlnMDNfcGxvdHMgPC0gcGxvdF9ncmlkKGZpZzAzX0JPRFlfcGxvdCwgZmlnMDNfSEVBUlRfcGxvdCwgZmlnMDNfTUlORF9wbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDMsIHJlbF9oZWlnaHRzID0gYygxLCAxLjExLCAxLjE5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAzfQpmaWcwM193aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwM19wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSAzOiBSYXcgY291bnRzIG9mIHJlc3BvbnNlcyBvZiAneWVzJyAoZGFyayksICdraW5kYScgKG1lZGl1bSksIG9yICdubycgKGxpZ2h0KSBmb3IgYWxsIG1lbnRhbCBjYXBhY2l0eSBpdGVtcywgZ3JvdXBlZCBieSB0aGUgZmFjdG9yIG9uIHdoaWNoIHRoZXkgbG9hZGluZyBtb3N0IHBvc2l0aXZlbHkgKEJPRFksIEhFQVJULCBNSU5EKSBhY2NvcmRpbmcgdG8gYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIG9mIGFkdWx0cycgcmVzcG9uc2VzIChTdHVkeSAxKS4gRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgY2hhcmFjdGVyczogYSBiZWV0bGUgKHBpbmspIG9yIGEgcm9ib3QgKGJsdWUpLiA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGFuZCBhZHVsdHMnIHJlc3BvbnNlcyBhcmUgc2hvd24gc2VwYXJhdGVseS4iLCA5MiksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwM193aXRoX2NhcHRpb24pCmBgYAoKYGBge3J9CmQxX2FsbF9idWNrZXRzIDwtIGQxX2FsbCAlPiUKICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICBkaXN0aW5jdChmYWN0b3IsIGNhcGFjaXR5LCBvcmRlcikgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yKSAlPiUKICB0b3BfbigtNiwgb3JkZXIpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBvcmRlcikKCmQxX2FsbF9lbmRvcnNlIDwtIGQxX2FsbCAlPiUKICBmaWx0ZXIoY2FwYWNpdHkgJWluJSBkMV9hbGxfYnVja2V0cyRjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKGVuZG9yc2UgPSBpZmVsc2UocmVzcG9uc2VfbnVtID4gMCwgMSwgMCkpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgc3ViaWQsIGNoYXJhY3RlciwgZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UocHJvcF9lbmRvcnNlID0gbWVhbihlbmRvcnNlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBuID0gbGVuZ3RoKGVuZG9yc2UpKSAlPiUKICB1bmdyb3VwKCkKCmQxX2FsbF9lbmRvcnNlX2Jvb3QgPC0gZDFfYWxsX2VuZG9yc2UgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAicHJvcF9lbmRvcnNlIikgJT4lCiAgdW5ncm91cCgpCmBgYAoKCmBgYHtyfQpmaWdTVVBQMV9wbG90IDwtIGQxX2FsbF9lbmRvcnNlX2Jvb3QgJT4lCiAgZmlsdGVyKCFpcy5uYShjaGFyYWN0ZXIpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuIiA9ICI3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlX2dyb3VwLCBncm91cCA9IGNoYXJhY3RlciwKICAgICAgICAgICAgIHkgPSBtZWFuLCBjb2xvciA9IGNoYXJhY3RlcikpICsgCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhmYWN0b3IpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDIvNiksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMCwgNiwgMikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gIm51bWJlciBvZiBpdGVtcyBlbmRvcnNlZCIsIGNvbG9yID0gImNoYXJhY3RlciIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KZmlnU1VQUDFfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnU1VQUDFfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSBTVVBQMTogTnVtYmVyIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyAob3V0IG9mIDYpIGVuZG9yc2VkIGluIGVhY2ggZG9tYWluIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGJ5IDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiBTdHVkeSAxLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzOiBhIGJlZXRsZSAocGluayBjaXJjbGVzKSBvciBhIHJvYm90IChibHVlIHNxdWFyZXMpLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscy4iLCA2MCksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWdTVVBQMV93aXRoX2NhcHRpb24pCmBgYAoKYGBge3J9CmZpZ1NVUFAyX3Bsb3QgPC0gZDFfYWxsX2VuZG9yc2UgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW4iKSAlPiUKICBsZWZ0X2pvaW4oZDFfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IHByb3BfZW5kb3JzZSwgCiAgICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLCBjb2xvciA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCh+IGZhY3RvcikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC40LCB3aWR0aCA9IDAsIGhlaWdodCA9IDAuMDMpICsKICBiaW5vbWlhbF9zbW9vdGgoYWVzKHdlaWdodCA9IG4pLCBzaG93LmxlZ2VuZCA9IEYpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLAogICMgICAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZDFfYWxsX2VuZG9yc2UgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgYWVzKHggPSAxMSksIGFscGhhID0gMC40LCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGRvZGdlLndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMC4wMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yNSkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGQxX2FsbF9lbmRvcnNlX2Jvb3QgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IDExLCB5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg3OjExKSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUwKDc6MTAsICJ5IiksICJhZHVsdHMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMS82KSwgbGFiZWxzID0gMDo2KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSwgMjIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxLCBzaXplID0gMykpKSArCiAgbGFicyh5ID0gIm51bWJlciBvZiBpdGVtcyBlbmRvcnNlZCAob3V0IG9mIDYpIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEYsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CmZpZ1NVUFAyX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZ1NVUFAyX3Bsb3QsIHN0cl93cmFwKCJGaWd1cmUgU1VQUDE6IE51bWJlciBvZiBtZW50YWwgY2FwYWNpdHkgaXRlbXMgKG91dCBvZiA2KSBlbmRvcnNlZCBpbiBlYWNoIGRvbWFpbiAoQk9EWSwgSEVBUlQsIGFuZCBNSU5EKSBieSA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGFuZCBhZHVsdHMgaW4gU3R1ZHkgMSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgY2hhcmFjdGVyczogYSBiZWV0bGUgKHBpbmsgY2lyY2xlcykgb3IgYSByb2JvdCAoYmx1ZSBzcXVhcmVzKS4gV2UgZGVmaW5lZCBlYWNoIGRvbWFpbiBieSB0aGUgNiBpdGVtcyB0aGF0IGxvYWRlZCB0aGUgbW9zdCBwb3NpdGl2ZWx5IG9uIHRoZSBjb3JyZXNwb25kaW5nIGZhY3RvciBpbiBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMsIGFuZCB3ZSBjb25zaWRlcmVkIHJlc3BvbnNlcyBvZiBlaXRoZXIgJ3llcycgb3IgJ2tpbmRhJyAoYnV0IG5vdCAnbm8nKSB0byBiZSBlbmRvcnNlbWVudHMuIExpbmVzIGNvcnJlc3BvbmQgdG8gbG9naXN0aWMgcmVncmVzc2lvbnMgY29uc2lkZXJpbmcgY2hpbGRyZW4ncyBzY29yZXMgYWxvbmUuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb24gYWR1bHRzJyBzY29yZXMuIiwgMTMwKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZ1NVUFAyX3dpdGhfY2FwdGlvbikKYGBgCgojIyMjIEFnZSBkaWZmZXJlbmNlcyB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZQoKT2YgY291cnNlLCBvdXIgc2FtcGxlIG9mICJjaGlsZHJlbiIgaW5jbHVkZWQgcGFydGljaXBhbnRzIGFzIHlvdW5nIGFzIDcgeWVhcnMgYW5kIHVwIHRvIG5lYXJseSAxMCB5ZWFycyBvZiBhZ2UuIEhvdyBkaWQgYXR0cmlidXRpb25zIHZhcnkgYWNyb3NzIHRoaXMgYWdlIHJhbmdlPyAKCmBgYHtyfQpkMV9jaF9hZ2UgPC0gZDFfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpCmBgYAoKYGBge3J9CiMgZWZhXzNfc2NvcmVzX3JfZDFfNzkgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2UgKiBjaGFyYWN0ZXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMXxzdWJpZCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlZmFfM19zY29yZXNfZDFfYWxsICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImNoaWxkcmVuNzkiLCAhaXMubmEoYWdlKSkgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IHNjYWxlKGFnZSwgc2NhbGUgPSBGKSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMjM0NSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZXMgPSA0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpKQojIHNhdmVSRFMoZWZhXzNfc2NvcmVzX3JfZDFfNzksIGZpbGUgPSAiLi9icm1zX21vZGVscy9lZmFfM19zY29yZXNfcl9kMV83OS5yZHMiKQoKZWZhXzNfc2NvcmVzX3JfZDFfNzkgPC0gcmVhZFJEUygiLi9icm1zX21vZGVscy9lZmFfM19zY29yZXNfcl9kMV83OS5yZHMiKQojIHN1bW1hcnkoZWZhXzNfc2NvcmVzX3JfZDFfNzkpCmBgYAoKVG8gZXhwbG9yZSBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBjb250aW51b3VzbHkgd2l0aGluIHRoZSBjaGlsZCBzYW1wbGUsIHdlIGNvbmR1Y3RlZCBhbiBhZGRpdGlvbmFsIHJlZ3Jlc3Npb24gYW5hbHlzaXMgb24gY2hpbGRyZW4ncyBmYWN0b3Igc2NvcmVzIGFsb25lLCBpbmNsdWRpbmcgaW50ZXJhY3Rpb25zIHdpdGggZXhhY3QgYWdlIGluIHllYXJzIChjZW50ZXJlZCBhdCB0aGUgbWVhbjogYHIgZm9ybWF0KHJvdW5kKG1lYW4oZDFfY2hfYWdlJGFnZSwgbmEucm0gPSBUKSwgMiksIG5zbWFsbCA9IDIpYHkpIHJhdGhlciB0aGFuIGFnZSBncm91cC4gSW4gbGluZSB3aXRoIHRoZSBhZ2UgZ3JvdXAgYW5hbHlzaXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGlzIGNvbmZpcm1lZCB0aGF0LCByZWxhdGl2ZSB0byB0aGUgZ3JhbmQgbWVhbiwgYXR0cmlidXRpb25zIG9mIF9IRUFSVF8gZGVjcmVhc2VkIHdpdGggYWdlIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxXzc5LCAiZmFjdG9yX25hbWVIX0dNOmFnZSIpYCkgYW5kIGF0dHJpYnV0aW9ucyBvZiBfTUlORF8gaW5jcmVhc2VkIHdpdGggYWdlIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxXzc5LCAiZmFjdG9yX25hbWVNX0dNOmFnZSIpYCkuIChTZWUgVGFibGUgMiBmb3IgdGhlIGZ1bGwgcmVzdWx0cyBvZiB0aGlzIG1vZGVsLikKCmBgYHtyLCBpbmNsdWRlID0gVCwgcmVzdWx0cyA9ICJhc2lzIn0KZml4ZWYoZWZhXzNfc2NvcmVzX3JfZDFfNzkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIlBhcmFtZXRlciIpICU+JQogIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKFBhcmFtZXRlciwKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgKHJvYm90IHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNIiA9ICJIRUFSVCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZU1fR00iID0gIk1JTkQgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIiwKICAgICJhZ2UiID0gImFnZSAobWVhbi1jZW50ZXJlZCkiLAogICAgImFnZTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlIiA9ICJIRUFSVCDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2UiID0gIk1JTkQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2U6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIE1JTkQgw5cgYWdlIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDI6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcywgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDEgYnkgY2hhcmFjdGVyIChiZWV0bGUsIHJvYm90KSwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBleGFjdCBhZ2UuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgKiBjaGFyYWN0ZXIgKyAoMSB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBGYWN0b3IgYW5kIGNoYXJhY3RlciB3ZXJlIGVmZmVjdC1jb2RlZCwgYW5kIGFnZSB3YXMgbWVhbi1jZW50ZXJlZC4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJDb2xsYXBzaW5nIGFjcm9zcyBhZ2UiLCAxLCA2KSAlPiUKICBncm91cF9yb3dzKCJBZ2UgZWZmZWN0cyIsIDcsIDEyKQpgYGAKCkluZGVlZCwgdmlzdWFsIGluc3BlY3Rpb24gb2YgRmlndXJlIDQgc3VnZ2VzdHMgdGhhdCwgYWNyb3NzIGFsbCB0aHJlZSBkb21haW5zIChfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8pLCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgdG8gYmVldGxlcyBhbmQgcm9ib3RzIGFwcGVhcmVkIHRvIGJlY29tZSBtb3JlIGFkdWx0LWxpa2Ugd2l0aCBhZ2XigJRidXQgd2hpbGUgdGhlIG9sZGVzdCBjaGlsZHJlbiB3ZXJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYWR1bHRzIGluIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBkb21haW5zLCBldmVuIHRoZSBvbGRlc3QgY2hpbGRyZW4gYXBwZWFyIHRvIGhhdmUgYXR0cmlidXRlZCBtb3JlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHRvIHRoZXNlIGVudGl0aWVzIHRoYW4gbW9zdCBhZHVsdHMgZGlkLgoKYGBge3J9CmZpZzA0X3Bsb3QgPC0gZ2dwbG90KGVmYV8zX3Njb3Jlc19kMV9hbGwgJT4lIGZpbHRlcighaXMubmEoYWdlKSksCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLCBjb2xvciA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCh+IGZhY3Rvcl9uYW1lLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC4yNSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZWZhXzNfc2NvcmVzX2QxX2FsbCAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICBhZXMoeCA9IDExKSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLjI1KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZWZhXzNfc2NvcmVzX2Jvb3RfZDFfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMSwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSAxLjI1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoNzoxMSksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg3OjEwLCAieSIpLCAiYWR1bHRzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSwgMjIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxLCBzaXplID0gMykpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNX0KZmlnMDRfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDRfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSA0OiBGYWN0b3Igc2NvcmVzIGZvciBhZHVsdHMgYW5kIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSwgcmVwbG90dGVkIHRvIGlsbHVzdHJhdGUgYWdlIGVmZmVjdHMgd2l0aGluIHRoZSBjaGlsZCBzYW1wbGUuIExpbmVzIGNvcnJlc3BvbmQgdG8gbGluZWFyIHJlZ3Jlc3Npb25zIGNvbnNpZGVyaW5nIGNoaWxkcmVuJ3Mgc2NvcmVzIGFsb25lLiBFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9uIGFkdWx0cycgc2NvcmVzLiBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHRoZSB5LWF4aXMgZGlmZmVycyBhY3Jvc3MgcGFuZWxzLiIsIDEzNSksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwNF93aXRoX2NhcHRpb24pCmBgYAoKVGFrZW4gdG9nZXRoZXIsIHRoZXNlIGFuYWx5c2VzIGNvbnZlcmdlIHRvIHN1Z2dlc3Qgb25seSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNoaWxkcmVuIGFuZCBhZHVsdHMgaW4gdGhlaXIgYXR0cmlidXRpb25zIG9mIF9CT0RZXyBhbmQgX01JTkRfIHRvIGJlZXRsZXMgYW5kIHJvYm90c+KAlGJ1dCBhIG1ham9yIGRpZmZlcmVuY2UgaW4gX0hFQVJUXzogUmVsYXRpdmUgdG8gYWR1bHRzLCBjaGlsZHJlbiB0ZW5kZWQgdG8gY3JlZGl0IGJvdGggYmVldGxlcyBhbmQgcm9ib3RzIHdpdGggbXVjaCBncmVhdGVyIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLiAKCiMjIERpc2N1c3Npb24KClN0dWR5IDEgc2hlZCBsaWdodCBvbiB0d28gZGlzdGluY3QgYXNwZWN0cyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgY2hpbGRyZW4ncyBjb25jcGV0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZTogY29udGludWl0eSBpbiB0aGUgdW5kZXJseWluZyBjb25jZXB0dWFsIF9zdHJ1Y3R1cmVfIGFuZCB2YXJpYWJpbHR5IGluIHRoZSBfYXBwbGljYXRpb25fIG9mIHRoZXNlIGNvbmNlcHRzLiAKCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZSBpcyBhZHVsdGxpa2UgYXQgNy05eQoKT24gdGhlIG9uZSBoYW5kLCBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgc3VnZ2VzdGVkIHRoYXQgYnkgbWlkZGRsZSBjaGlsZGhvb2QgKDctOXkpLCB0aGUgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJseWluZyBVUyBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiBVUyBhZHVsdHMsIGFuY2hvcmVkIGJ5IHN1aXRlcyBvZiBtZW50YWwgY2FwYWNpdGllcyByZWxhdGVkIHRvIF9CT0RZXyAocGh5c2lvbG9naWNhbCBzZW5zYXRpb25zKSwgX0hFQVJUXyAoc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMpLCBhbmQgX01JTkRfIChwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMpLiBXZSBub3RlIHRoYXQsIGluIHByaW5jaXBsZSwgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBvciBhbHRlcm5hdGl2ZSBsYXRlbnQgZmFjdG9ycyBjb3VsZCBoYXZlIGVtZXJnZWQgZnJvbSB0aGUgZmFjdG9yIGFuYWx5c2lzIG9mIGNoaWxkcmVuJ3MgcmVzcG9uc2VzLiBGb3IgZXhhbXBsZSwgY2hpbGRyZW4gbWlnaHQgaGF2ZSBkaXN0aW5ndWlzaGVkIHByaW1hcmlseSBiZXR3ZWVuIGludGVybmFsIGV4cGVyaWVuY2UgYW5kIGV4dGVybmFsIGFjdGlvbiAoR3JheSBldCBhbC4sIDIwMDcpLCBvciB0aGV5IG1pZ2h0IGhhdmUgZGVtb25zdHJhdGVkIGZpbmVyLWdyYWluZWQgZ3JvdXBpbmdzIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGJhc2VkIG9uIHBocmFzaW5nLCByb3RlIGtub3dsZWRnZSwgZXRjLiBJbnN0ZWFkLCB0aGUgbGF0ZW50IGNvbmNlcHR1YWwgc3RydWN0dXJlIHVuZGVybHlpbmcgY2hpbGRyZW4ncyByZXNwb25zZXMgYXBwZWFycyB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiBhZHVsdHMsIGJvdGggaW4gdGhpcyBzdHVkeSBhbmQgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgcHJldmlvdXMgd29yay4gSW4gb3RoZXIgd29yZHMsIGFueSBkcmFtYXRpYyBkZXZlbG9wbWVudGFsIGNoYW5nZXMgdG8gdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBsaWtlbHkgb2NjdXIgcHJpb3IgdG8gdGhlIGFnZSBvZiA3IHllYXJzLgoKIyMjIEF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIHVuZGVyZ28gZHJhbWF0aWMgZGV2ZWxvcG1lbnQgZXh0ZW5kaW5nIHdlbGwgaW50byBtaWRkbGUgY2hpbGRob29kCgpPbiB0aGUgb3RoZXIgaGFuZCwgYW5hbHlzZXMgb2YgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgd2l0aGluIHRoaXMgc2hhcmVkIGNvbmNlcHR1YWwgc3RydWN0dXJlIHN1Z2dlc3RlZCB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIG9mIHRoaXMgY29uY2VwdOKAlGluIHBhcnRpY3VsYXIsIHRoZWlyIGF0dHJpYnV0aW9ucyBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgb2YgdGhlIF9IRUFSVF/igJRtYXkgYmUgdW5kZXJnb2luZyBzdWJzdGFudGlhbCByZWZpbmVtZW50IHRocm91Z2ggbWlkZGxlIGNoaWxkaG9vZC4gVGhlIHNwZWNpZmljaXR5IG9mIHRoaXMgYWdlIGRpZmZlcmVuY2XigJR3aGljaCBlbWVyZ2VkIGRyYW1hdGljYWxseSBpbiBvbmUgZG9tYWluIChfSEVBUlRfKSwgYnV0IG5vdCBvdGhlcnMgKF9CT0RZXywgX01JTkRfKeKAlHN1Z2dlc3RzIHRoYXQgdGhpcyBpcyB1bmxpa2VseSB0byBiZSBkdWUgZWl0aGVyIHRvIGEgZ2VuZXJhbCB0ZW5kZW5jeSB0b3dhcmQgIm1lbnRhbGl6aW5nIiB0aGVzZSBjaGFyYWN0ZXJzIChvciBhIHNpbXBsZSAieWVzIiBiaWFzKS4gQnV0IGl0cyBleHRlbnNpb24gdG8gYm90aCBiZWV0bGVzIGFuZCByb2JvdHMgcmFpc2VzIG1hbnkgcXVlc3Rpb25zLiBXaXRoIHJlZ2FyZCB0byByb2JvdHMsIGNoaWxkcmVuIGdyb3dpbmcgdXAgaW4gdGhlIDIxc3QgY2VudHVyeSBtaWdodCBiZSBjb252ZXJnaW5nIG9uIGEgbmV3IHVuZGVyc3RhbmRpbmcgb2YgdGVjaG5vbG9naWNhbCAiYmVpbmdzIiBhcyBpbmFuaW1hdGUgb2JqZWN0cyB3aXRoIHNvbWUgZGVncmVlIG9mIHNvY2lhbC1lbW90aW9uYWwgbGlmZSAoc2VlIEthaG4sIEdhcnksICYgU2hlbiwgMjAxMynigJRidXQgdGhpcyBraW5kIG9mIGhpc3RvcmljYWwgY29uY2VwdHVhbCBjaGFuZ2Ugd291bGQgbm90IHByZWRpY3QgdGhlIGhpZ2ggcmF0ZXMgb2Ygc29jaWFsLWVtb3Rpb25hbCBhdHRyaWJ1dGlvbnMgdG8gYmVldGxlcyB0aGF0IHdlIG9ic2VydmVkLiBPdXIgZmluZGluZ3MgYXJlIHBlcmhhcHMgbW9yZSBjb25zaXN0ZW50IHdpdGggYSBnZW5lcmFsIG9wZW5uZXNzIHRvIHVudHJhZGl0aW9uYWwgc29jaWFsIHBhcnRuZXJzIHRoYXQgZXh0ZW5kcyBpbnRvIG1pZGRsZSBjaGlsZGhvb2QgKGJ1dCBub3QgYWR1bHRob29kKeKAlG9yIHdpdGggYSBkaWZmZXJlbmNlIGluIGNvbnN0cnVhbHMgb2Ygd2hhdCBpdCBtZWFucyB0byBmZWVsIHByb3VkLCBoYXBweSwgZ3VpbHR5LCBldGMuIFRvIHdoYXQga2luZHMgb2YgZW50aXRpZXMgd291bGQgY2hpbGRyZW4gb2YgdGhpcyBhZ2UgZGVueSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcywgYW5kIGhvdyBkbyB0aGV5IGRyYXcgdGhpcyBsaW5lPyBIb3cgd291bGQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIChhcyB3ZWxsIGFzIF9CT0RZXyBhbmQgX01JTkRfKSBjb21wYXJlPwoKIyBTdHVkeSAyCgpUaGUgZ29hbHMgb2YgU3R1ZHkgMiB3ZXJlIHRocmVlZm9sZC4gCgpGaXJzdCwgd2UgYWltZWQgdG8gZXh0ZW5kIG91ciBmaW5kaW5ncyB3aXRoIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSwgYnkgZXhwYW5kaW5nIHRoZSBsaXN0IG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVycyB0byBpbmNsdWRlIG5vdCBvbmx5IHRoZSB0d28gImVkZ2UgY2FzZXMiIGZyb20gU3R1ZHkgMSAoYSBiZWV0bGUgYW5kIGEgcm9ib3QpLCBidXQgYSBhbHNvIGEgd2lkZXIgcmFuZ2Ugb2YgYW5pbWF0ZSBiZWluZ3MgKGEgYmlyZCwgYSBnb2F0LCBhbmQgYW4gZWxlcGhhbnQpIGFuZCBpbmFuaW1hdGUgb2JqZWN0cyAoYSBjb21wdXRlciwgYSB0ZWRkeSBiZWFyLCBhbmQgYSBkb2xsKS4gSW4gY29udHJhc3QgdG8gU3R1ZHkgMSwgd2hlcmUgd2UgdHJhY2tlZCB3aGljaCBtZW50YWwgY2FwYWNpdGllcyAiaGFuZyB0b2dldGhlciIgd2hlbiBwYXJ0aWNpcGFudHMgcmVhc29uZWQgYWJvdXQgY29udHJvdmVyc2lhbCAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZywgU3R1ZHkgMiBhbGxvd2VkIHVzIHRvIHRyYWNrIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzICJoYW5nIHRvZ2V0aGVyIiB3aGVuIHRhcmdldCBjaGFyYWN0ZXJzIGFyZSBwZXJjZWl2ZWQgdG8gdmFyeSBpbiB0aGVpciBtZW50YWwgY2FwYWNpdHkgcHJvZmlsZXMuIEluIFdlaXNtYW4gZXQgYWwuJ3Mgb3JpZ2luYWwgc3R1ZGllcywgdGhpcyBhcHByb2FjaCB5aWVsZGVkIGEgaGlnaGx5IHNpbWlsYXIgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdG8gdGhlICJlZGdlIGNhc2UiIGFwcHJvYWNoIChXZWlzbWFuIGV0IGFsLiwgMjAxNzsgU3R1ZHkgNCkuIFdlIHJlYXNvbmVkIHRoYXQgaWYgdGhpcyB0aHJlZS1wYXJ0IGNvbmNlcHR1YWwgc3RydWN0dXJlIGlzIHN0YWJsZSBhbmQgcm9idXN0IGJ5IHRoZSBhZ2Ugb2YgNy05IHllYXJzLCBpdCBzaG91bGQgbWFuaWZlc3QgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB1bmRlciB0aGUgc2FtZSByYW5nZSBvZiBjb25kaXRpb25zIHRoYXQgaXQgZG9lcyBhbW9uZyBhZHVsdHMuIAoKT3VyIHNlY29uZCBnb2FsIHdhcyB0byBhc3Nlc3MgdGhlIGVhcmxpZXIgZGV2ZWxvcG1lbnQgb2YgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgaW4gYSBncm91cCBvZiB5b3VuZ2VyIGNoaWxkcmVuLiBXZSB0YXJnZXRlZCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGZvciBvdXIgeW91bmdlciBhZ2UgZ3JvdXAgYmVjYXVzZSB0aGlzIGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgYSBwZXJpb2Qgb2YgZHJhbWF0aWMgZGV2ZWxvcG1lbnQgaW4gc2V2ZXJhbCByZWxldmFudCBkb21haW5zLiBNYW55IHN0dWRpZXMgaGF2ZSBkb2N1bWVudGVkIHNoaWZ0cyBpbiBjaGlsZHJlbidzIGFiaWxpdGllcyB0byB0YWtlIG90aGVycycgcGVyc3BlY3RpdmVzLCByZXByZXNlbnQgZmFsc2UgYmVsaWVmcywgYW5kIGludGVncmF0ZSByZXByZXNlbnRhdGlvbnMgb2YgaW50ZW50aW9ucyBhbmQgb3V0Y29tZXMgaW4gZXZhbHVhdGluZyBtb3JhbCByZXNwb25zaWJpbGl0eSAoZm9yIHJldmVpd3MsIHNlZSBGbGF2ZWxsLCAxOTk5OyBXZWxsbWFuLCAyMDE1KS4gVGhlIHByZXNjaG9vbCB5ZWFycyBoYXZlIGFsc28gYmVlbiB0aGUgZm9jdXMgb2YgYSByaWNoIHRyYWRpdGlvbiBvZiB3b3JrIG9uIGxheSBiaW9sb2d5IGFuZCB0aGUgYW5pbWF0ZS1pbmFuaW1hdGUgZGlzdGluY3Rpb24gZXh0ZW5kaW5nIGJhY2sgbmVhcmx5IGEgY2VudHVyeSAoZS5nLiwgQ2FyZXksIDE5ODU7IFIuIEdlbG1hbiwgU3BlbGtlLCAmIE1lY2ssIDE5ODM7IE1lZGluLCBXYXhtYW4sIFdvb2RyaW5nLCAmIFdhc2hpbmF3YXRvaywgMjAxMDsgUGlhZ2V0LCAxOTI5OyBmb3IgYSByZXZpZXcsIHNlZSBTLiBHZWxtYW4gJiBPcGZlciwgMjAwMikuIEFsbCBvZiB0aGVzZSBhY2NvdW50cyBtYWtlIHRoZSBjYXNlIHRoYXQgYmVjb21pbmcgYSBzb3BoaXN0aWNhdGVkIHJlYXNvbmVy4oCUYW5kIHBhcnRpY3VsYXJseSBhIHNvcGhpc3RpY2F0ZWQgc29jaWFsIHJlYXNvbmVy4oCUcmVxdWlyZXMgc3Vic3RhbnRpYWwgcmVmaW5lbWVudCBvZiBvbmUncyByZXByZXNlbnRhdGlvbnMgb2Ygb3RoZXJzJyBleHBlcmllbmNlcywgYmVsaWVmcywgZGVzaXJlcywgYW5kIG5lZWRzLiBNaWdodCB0aGVzZSByZWZpbmVtZW50cyBpbmNsdWRlIGNoYW5nZXMgdG8gdGhlIHN0cnVjdHVyZSBvZiBjaGlsZHJlbidzIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlPyAKCk91ciB0aGlyZCBnb2FsIHdhcyB0byBleGFtaW5lIGFnZS1yZWxhdGVkIGNoYW5nZXMgaW4gd2hpY2ggbWVudGFsIGNhcGFjaXRpZXMgdGVuZCB0byBiZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldCBjaGFyYWN0ZXJzLiBJbiBzdW1tYXJpemluZyB0aGUgcmVzdWx0cyBvZiBTdHVkeSAxLCB3ZSBkaXNjdXNzZWQgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhcyB0aGUgImFwcGxpY2F0aW9uIiBvZiBjb25jZXB0cyBvZiBtZW50YWwgbGlmZSwgaW4gY29udHJhc3QgdG8gdGhlIGNvbmNlcHR1YWwgInN0cnVjdHVyZSIgcmV2ZWFsZWQgYnkgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzLiBCeSBleHBhbmRpbmcgdGhlIHJhbmdlIG9mIHRhcmdldCBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoZSBzdHVkeSwgU3R1ZHkgMiBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBleHBsb3JlIGNoYW5nZXMgaW4gaG93IGNoaWxkcmVuIGFwcGx5IHRoZWlyIGRldmVsb3BpbmcgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUgdG8gYSB2YXJpZXR5IG9mIGFuaW1hdGUgYmVpbmdzIGFuZCBpbmFuaW1hdGUgb2JqZWN0cy4KCiMjIE1ldGhvZAoKIyMjIFBhcnRpY2lwYW50cwoKYHIgbnJvdyhkMl9hZF93aWRlKSArIG5yb3coZDJfNzlfd2lkZSkgKyBucm93KGQyXzQ2X3dpZGUpYCBwZW9wbGUgcGFydGljaXBhdGVkIGluIHRoaXMgc3R1ZHksIGluY2x1ZGluZyBhIGdyb3VwIG9mIGFkdWx0cywgYSBncm91cCBvZiAib2xkZXIiIGNoaWxkcmVuICg3LTl5KSwgYW5kIGEgZ3JvdXAgb2YgInlvdW5nZXIiIGNoaWxkcmVuICg0LTZ5KS4KCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkMl9hZF9nZW5kZXIgPC0gZGVtb19mdW4oZDJfYWQsICJnZW5kZXIiLCAyKQpkMl9hZF9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDJfYWQsICJldGhuaWNpdHlfY2F0IiwgMikKYGBgCgpBZHVsdHMgKF9uXz1gciBucm93KGQyX2FkX3dpZGUpYCkgcGFydGljaXBhdGVkIHZpYSBNVHVyayBpbiBTZXB0ZW1iZXIgMjAxOC4gQWR1bHQgcGFydGljaXBhbnRzIGhhZCBnYWluZWQgYXBwcm92YWwgZm9yIGF0IGxlYXN0IDk1JSBvZiB0aGVpciBwcmV2aW91cyB3b3JrIG9uIE1UdXJrOyBoYWQgTVR1cmsgYWNjb3VudHMgYmFzZWQgaW4gdGhlIFVTOyBhbmQgaW5kaWNhdGVkIHRoYXQgdGhleSB3ZXJlIGF0IGxlYXN0IDE4IHllYXJzIG9sZC4gQWR1bHRzIHdlcmUgcGFpZCBcJDAuNDUgZm9yIGFwcHJveGltYXRlbHkgMi00IG1pbnV0ZXMgb2YgdGhlaXIgdGltZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQyX2FkJGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYCBtaW4pLiBBbiBhZGRpdGlvbmFsIDIyIGFkdWx0cyBwYXJ0aWNpcGF0ZWQgYnV0IHdlcmUgZXhjbHVkZWQgZm9yIGZhaWxpbmcgdG8gcmVzcG9uZCBzZW5zaWJseSB0byBhbiBvcGVuLWVuZGVkIHF1ZXN0aW9uIGFib3V0IHdoYXQgdGhleSBoYWQgYmVlbiBhc2tlZCB0byBkbyBpbiB0aGUgc3R1ZHkgKGUuZy4sIGNvcHlpbmcgYW5kIHBhc3RpbmcgdGV4dCBmcm9tIHRoZSBxdWVzdGlvbiwgd3JpdGluZyAiZ29vZCBzdHVkeSwiIG9yIGRlc2NyaWJpbmcgYSBkaWZmZXJlbnQgc3R1ZHksIGUuZy4sICJJIHdyb3RlIGFuIGVzc2F5IGFib3V0IG5hdHVyZSI7IF9uXz0xMSkgb3IgZm9yIGZhaWxpbmcgdG8gcGFzcyBvbmUgb3IgbW9yZSBhdHRlbnRpb24gY2hlY2tzIChlLmcuLCAiUGxlYXNlIHNlbGVjdCBubyI7IF9uXz0xMSkuIEFjY29yZGluZyB0byBzZWxmIHJlcG9ydCwgdGhlIGZpbmFsIGFkdWx0IHNhbXBsZSByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkMl9hZCRhZ2UpWyJNaW4uIl1gLWByIHN1bW1hcnkoZDJfYWQkYWdlKVsiTWF4LiJdYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQyX2FkJGFnZSlbIk1lZGlhbiJdYHkpIGFuZCBpbmNsdWRlZCBzbGlnaHRseSBtb3JlIG1lbiAoYHIgcm91bmQoZDJfYWRfZ2VuZGVyJHByb3BbZDJfYWRfZ2VuZGVyJGdlbmRlcj09Im0iXSwgMikgKiAxMDBgJSkgdGhhbiB3b21lbiAoYHIgcm91bmQoZDJfYWRfZ2VuZGVyJHByb3BbZDJfYWRfZ2VuZGVyJGdlbmRlcj09ImYiXSwgMikgKiAxMDBgJSkuIEFkdWx0cyBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgYXMgV2hpdGUgKGByIGQyX2FkX2V0aG5pY2l0eSRwcm9wW2QyX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0id2hpdGUiXSAqIDEwMGAlOyBgciBkMl9hZF9ldGhuaWNpdHkkcHJvcFtkMl9hZF9ldGhuaWNpdHkkZXRobmljaXR5X2NhdD09Im11bHRpIl0gKiAxMDBgJSBpZGVudGlmaWVkIGFzIG1vcmUgdGhhbiBvbmUgcmFjZS9ldGhuaWNpdHksIGFuZCAkXGxlcSQgYHIgZGF0YS5mcmFtZShkMl9hZF9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5X2NhdCAlaW4lIGMoIndoaXRlIiwgIm11bHRpIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIGFzIGFueSBvdGhlciByYWNlL2V0aG5pY2l0eSkuCgpgYGB7cn0KIyBkZW1vZ3JhcGhpY3MKZDJfNzlfZ2VuZGVyIDwtIGRlbW9fZnVuKGQyXzc5LCAiZ2VuZGVyIiwgMikKZDJfNzlfZXRobmljaXR5IDwtIGRlbW9fZnVuKGQyXzc5LCAiZXRobmljaXR5IiwgMikKZDJfNDZfZ2VuZGVyIDwtIGRlbW9fZnVuKGQyXzQ2LCAiZ2VuZGVyIiwgMikKZDJfNDZfZXRobmljaXR5IDwtIGRlbW9fZnVuKGQyXzQ2LCAiZXRobmljaXR5IiwgMikKYGBgCgpXZSByZWNydWl0ZWQgdHdvIGdyb3VwcyBvZiBjaGlsZHJlbjogIm9sZGVyIiBjaGlsZHJlbiAoNy05eSkgYW5kICJ5b3VuZ2VyIiBjaGlsZHJlbiAoNC02eSkuIE91ciBwbGFubmVkIHNhbXBsZSBzaXplIHdhcyAxMjAgcGVyIGFnZSBncm91cCwgYnV0IHdlIGFsc28gcmV0YWluZWQgYSBoYW5kZnVsIG9mIGV4dHJhIHBhcnRpY2lwYW50cyB3aG8gY29tcGxldGVkIHRoZSBzdHVkeSBvbiB0aGUgZmluYWwgZGF5IG9mIGRhdGEgY29sbGVjdGlvbiBmb3IgZWFjaCBncm91cC4KClRoZSBncm91cCB0aGF0IHdlIHdpbGwgcmVmZXIgdG8gYXMgIm9sZGVyIGNoaWxkcmVuIiAoX25fPWByIG5yb3coZDJfNzlfd2lkZSlgKSByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgLWByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYHkpLCBhbmQgcGFydGljaXBhdGVkIGF0IG9uZSBvZiBzZXZlcmFsIFNhbiBGcmFuY2lzY28gQmF5IEFyZWEgbXVzZXVtcyBvciBhdCB0aGVpciB5b3VuZ2VyIHNpYmxpbmcncyBwcmVzY2hvb2wgYmV0d2VlbiBKdWx5LURlY2VtYmVyIDIwMTYuIFRoZSBzdHVkeSB0b29rIG1vc3Qgb2xkZXIgY2hpbGRyZW4gdW5kZXIgYHIgcXVhbnRpbGUoZDJfNzkkZHVyYXRpb24sIC43NSwgbmEucm0gPSBUKSAlPiUgYXMubnVtZXJpYygpICU+JSBjZWlsaW5nKClgIG1pbnV0ZXMgdG8gY29tcGxldGUgKG1lZGlhbiBkdXJhdGlvbjogYHIgc3VtbWFyeShkMl83OSRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCBtaW4pLiBBY2NvcmRpbmcgdG8gcGFyZW50YWwgcmVwb3J0LCB0aGUgc2FtcGxlIG9mIG9sZGVyIGNoaWxkcmVuIGluY2x1ZGVkIHNsaWdodGx5IG1vcmUgYm95cyAoYHIgZDJfNzlfZ2VuZGVyJHByb3BbZDJfNzlfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlKSB0aGFuIGdpcmxzIChgciBkMl83OV9nZW5kZXIkcHJvcFtkMl83OV9nZW5kZXIkZ2VuZGVyPT0iZiJdICogMTAwYCUpOyBgciBkMl83OV9nZW5kZXIkcHJvcFtkMl83OV9nZW5kZXIkZ2VuZGVyPT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyBnZW5kZXIgd2FzIG5vbi1iaW5hcnkgb3IgdW5rbm93bikuIFBhcmVudHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIHRoZWlyIGNoaWxkcmVuIGFzIFdoaXRlIChgciBkMl83OV9ldGhuaWNpdHkkcHJvcFtkMl83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0id2hpdGUiXSAqIDEwMGAlKSwgU291dGggQXNpYW4gKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iXSAqIDEwMGAlKSwgbXVsdGlyYWNpYWwgKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJtdWx0aSJdICogMTAwYCUpLCBvciBFYXN0IEFzaWFuIChgciBkMl83OV9ldGhuaWNpdHkkcHJvcFtkMl83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0iZWFzdCBhc2lhbiJdICogMTAwYCUpOyAkXGxlcSQgYHIgZGF0YS5mcmFtZShkMl83OV9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5ICVpbiUgYygid2hpdGUiLCAibXVsdGkiLCAiZWFzdCBhc2lhbiIsICJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iLCAiTUlTU0lORyIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBvZiBjaGlsZHJlbiB3ZXJlIGlkZW50aWZpZWQgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5LCBhbmQgYHIgZDJfNzlfZXRobmljaXR5JHByb3BbZDJfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09Ik1JU1NJTkciXSAqIDEwMGAlIG9mIGNoaWxkcmVuJ3MgcGFyZW50cyBkZWNsaW5lZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZWlyIHJhY2UvZXRobmljaXR5KS4gCgoiWW91bmdlciBjaGlsZHJlbiIgKF9uXz1gciBucm93KGQyXzQ2X3dpZGUpYCkgcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDJfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYC1gciBzdW1tYXJ5KGQyXzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMl80NiRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWB5KSwgYW5kIHBhcnRpY2lwYXRlZCBlaXRoZXIgYXQgYSB1bml2ZXJzaXR5LWFmZmlsaWF0ZWQgcHJlc2Nob29sIG9yIGF0IGEgQmF5IEFyZWEgbXVzZXVtIGJldHdlZW4gSmFudWFyeS1KdW5lIDIwMTcuIFRoZSBzdHVkeSB0b29rIG1vc3QgeW91bmdlciBjaGlsZHJlbiB1bmRlciBgciBxdWFudGlsZShkMl80NiRkdXJhdGlvbiwgLjc1LCBuYS5ybSA9IFQpICU+JSBhcy5udW1lcmljKCkgJT4lIGNlaWxpbmcoKWAgbWludXRlcyB0byBjb21wbGV0ZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQyXzQ2JGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIG1pbikuIEFjY29yZGluZyB0byBwYXJlbnRhbCByZXBvcnQgYW5kIHNjaG9vbCByZWNvcmRzLCB0aGUgc2FtcGxlIG9mIHlvdW5nZXIgY2hpbGRyZW4gaW5jbHVkZWQgcm91Z2hseSB0aGUgc2FtZSBudW1iZXIgb2YgZ2lybHMgKGByIGQyXzQ2X2dlbmRlciRwcm9wW2QyXzQ2X2dlbmRlciRnZW5kZXI9PSJtIl0gKiAxMDBgJSkgYW5kIGJveXMgKGByIGQyXzQ2X2dlbmRlciRwcm9wW2QyXzQ2X2dlbmRlciRnZW5kZXI9PSJmIl0gKiAxMDBgJSkuIENoaWxkcmVuIHdlcmUgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIG11bHRpcmFjaWFsIChgciBkMl80Nl9ldGhuaWNpdHkkcHJvcFtkMl80Nl9ldGhuaWNpdHkkZXRobmljaXR5PT0ibXVsdGkiXSAqIDEwMGAlKSBvciBXaGl0ZSAoYHIgZDJfNDZfZXRobmljaXR5JHByb3BbZDJfNDZfZXRobmljaXR5JGV0aG5pY2l0eT09IndoaXRlIl0gKiAxMDBgJTsgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDJfNDZfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eSAlaW4lIGMoIndoaXRlIiwgIm11bHRpIiwgIk1JU1NJTkciKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgb2YgY2hpbGRyZW4gd2VyZSBpZGVudGlmaWVkIGFzIGFueSBvdGhlciByYWNlL2V0aG5pY2l0eSwgYW5kIGByIGQyXzQ2X2V0aG5pY2l0eSRwcm9wW2QyXzQ2X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJNSVNTSU5HIl0gKiAxMDBgJSBvZiBjaGlsZHJlbidzIHBhcmVudHMgZGVjbGluZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiB0aGVpciByYWNlL2V0aG5pY2l0eSkuCgpBbiBhZGRpdGlvbmFsIDcgY2hpbGRyZW4gcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBiZWluZyBvdXRzaWRlIHRoZSB0YXJnZXQgYWdlIHJhbmdlcy4gQXQgbXVzZXVtcyAoYnV0IG5vdCBhdCB0aGUgcHJlc2Nob29sKSwgY2hpbGRyZW4gcmVjZWl2ZWQgYSBzbWFsbCB0aGFuay15b3UgZ2lmdCAoZS5nLiwgYSBzdGlja2VyKSBmb3IgdGhlaXIgcGFydGljaXBhdGlvbi4gCgojIyMgTWF0ZXJpYWxzIGFuZCBwcm9jZWR1cmUKClBpbG90IHRlc3Rpbmcgc3VnZ2VzdGVkIHRoYXQgd29ya2luZyB3aXRoIHlvdW5nZXIgY2hpbGRyZW4gd291bGQgcmVxdWlyZSBtYWtpbmcgYSBicmllZmVyIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSB3aXRoIGZld2VyIHRoYW4gdGhlIDQwIHF1ZXN0aW9ucyBpbmNsdWRlZCBpbiBTdHVkeSAxOyBsaW1pdGluZyB0aGUgbGlzdCB0byAyMCBxdWVzdGlvbnMgc2VlbWVkIHRvIGFsbG93IGNoaWxkcmVuIGFzIHlvdW5nIGFzIDQgeWVhcnMgb2YgYWdlIHRvIGNvbXBsZXRlIHRoZSBzdHVkeSBlYXNpbHkgYW5kIHdpdGhvdXQgZ2V0dGluZyBib3JlZCBvciBmcnVzdHJhdGVkLCB3aGlsZSBzdGlsbCBpbmNsdWRpbmcgZW5vdWdoIGl0ZW1zIHRvIGVuYWJsZSB1cyB0byBwcm9jZWVkIHdpdGggb3VyIGV4cGxvcmF0b3J5ICJkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24iIGFwcHJvYWNoIHRvIHVuY292ZXJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmUuCgpgYGB7cn0KZDJfYWRfY2hhciA8LSBkZW1vX2Z1bihkMl9hZCwgImNoYXJhY3RlciIpCmQyXzc5X2NoYXIgPC0gZGVtb19mdW4oZDJfNzksICJjaGFyYWN0ZXIiKQpkMl80Nl9jaGFyIDwtIGRlbW9fZnVuKGQyXzQ2LCAiY2hhcmFjdGVyIikKZDJfYWxsX2NoYXIgPC0gZDJfYWRfY2hhciAlPiUgbXV0YXRlKGFnZV9ncm91cCA9ICJhZHVsdHMiKSAlPiUKICBmdWxsX2pvaW4oZDJfNzlfY2hhciAlPiUgbXV0YXRlKGFnZV9ncm91cCA9ICJjaGlsZHJlbjc5IikpICU+JQogIGZ1bGxfam9pbihkMl80Nl9jaGFyICU+JSBtdXRhdGUoYWdlX2dyb3VwID0gImNoaWxkcmVuNDYiKSkKYGBgCgpQYXJ0aWNpcGFudHMgd2VyZSBhc3NpZ25lZCB0byBldmFsdWF0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0YXJnZXQgY2hhcmFjdGVyczogYW4gZWxlcGhhbnQsIGEgZ29hdCwgYSBtb3VzZSwgYSBiaXJkLCBhIGJlZXRsZSwgYSB0ZWRkeSBiZWFyLCBhIGRvbGwsIGEgcm9ib3QsIG9yIGEgY29tcHV0ZXIgKF9uXyBwZXIgY2hhcmFjYXRlcjogYHIgbWluKGQyX2FkX2NoYXIkbilgLWByIG1heChkMl9hZF9jaGFyJG4pYCBhZHVsdHMsIGByIG1pbihkMl83OV9jaGFyJG4pYC1gciBtYXgoZDJfNzlfY2hhciRuKWAgb2xkZXIgY2hpbGRyZW4sIGFuZCBgciBtaW4oZDJfNDZfY2hhciRuKWAtYHIgbWF4KGQyXzQ2X2NoYXIkbilgIHlvdW5nZXIgY2hpbGRyZW47IHNlZSBGaWd1cmUgNiBmb3IgZXhhY3QgY291bnRzKS4KClBhcnRpY2lwYW50cyB3ZXJlIGFzc2lnbmVkIHRvIHRhcmdldCBjaGFyYWN0ZXJzIHJhbmRvbWx5LCB3aXRoIHR3byBleGNlcHRpb25zOiAoMSkgVGhlIGRvbGwgYW5kIHRlZGR5IGJlYXIgY29uZGl0aW9ucyB3ZXJlIHJ1biBsYXN0IGZvciBvbGRlciBjaGlsZHJlbiAoYnV0IGluY2x1ZGVkIGluIHRoZSBpbml0aWFsIHJhbmRvbWl6YXRpb24gc2NoZW1lIGZvciBhZHVsdHMgYW5kIHlvdW5nZXIgY2hpbGRyZW4pOyBhbmQgKDIpIFRvd2FyZCB0aGUgZW5kIG9mIGRhdGEgY29sbGVjdGlvbiB3aXRoIGNoaWxkcmVuLCBjaGlsZHJlbiB3ZXJlIGFzc2lnbmVkIHRvIGNvbmRpdGlvbnMgdGhhdCBoYWQgdGhlIGZld2VzdCBwYXJ0aWNpcGFudHMuIChUaGlzIHdhcyBub3QgcG9zc2libGUgd2l0aCBhZHVsdHMsIHdoaWNoIGlzIHdoeSB0aGUgbnVtYmVyIG9mIGFkdWx0cyBwZXIgY29uZGl0aW9uIHdhcyBtb3JlIHZhcmlhYmxlIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgY29uZGl0aW9uLikgQXMgaW4gU3R1ZHkgMSwgYSB2aXZpZCwgaGlnaC1yZXNvbHV0aW9uIHBob3RvIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIGEgbmF0dXJhbGlzdGljIGNvbnRleHQgd2FzIHZpc2libGUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3R1ZHkuIAoKSW5zdHJ1Y3Rpb25zIGFuZCBwcm9jZWR1cmUgd2VyZSBpZGVudGljYWwgdG8gU3R1ZHkgMSwgd2l0aCB0d28gZXhjZXB0aW9uczogKDEpIFBhcnRpY2lwYW50cyByYXRlZCB0aGUgdGFyZ2V0IGNoYXJhY3RlciBvbiAyMCAocmF0aGVyIHRoYW4gNDApIG1lbnRhbCBjYXBhY2l0aWVzOyBhbmQgKDIpIEZvciB5b3VuZ2VyIGNoaWxkcmVuLCB0aGUgZXhwZXJpbWVudGVyIHJlYWQgYWxsIHF1ZXN0aW9ucyBvdXQgbG91ZCBhbmQgY2hpbGRyZW4gcmVzcG9uZGVkIHZlcmJhbGx5LiAKClRoZSAyMCBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGEgc3Vic2V0IG9mIHRoZSA0MCBpdGVtcyB1c2VkIGluIFN0dWR5IDEsIGNob3NlbiB0byBpbmNsdWRlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgZW1vdGlvbmFsIGV4cGVyaWVuY2VzLCBwZXJjZXB0dWFsIGFiaWxpdGllcywgY29nbml0aXZlIHNraWxscywgY2FwYWNpdGllcyByZWxhdGVkIHRvIGF1dG9ub215IG9yIGFnZW5jeSwgYW5kIHNvY2lhbCBhYmlsaXRpZXM7IGFuZCB0byBpbmNsdWRlIHNvbWUgb2YgdGhlIHN0cm9uZ2VzdC1sb2FkaW5nIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBmYWN0b3JzIHVuY292ZXJlZCBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMSAoc2VlIEZpZ3VyZSAxKS4gQXMgaW4gU3R1ZHkgMSwgZWFjaCBtZW50YWwgY2FwYWNpdHkgd2FzIGFzc29jaWF0ZWQgd2l0aCBhIHNob3J0LCBwcmVzZXQgZGVmaW5pdGlvbi4gQm90aCBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbiB3ZXJlIGVuY291cmFnZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3R1ZHkgdG8gYXNrIHF1ZXN0aW9ucyBpZiB0aGV5IGRpZCBub3Qga25vdyB3aGF0IGEgd29yZCBtZWFudCwgaW4gd2hpY2ggY2FzZSB0aGV5IHdlcmUgZ2l2ZW4gdGhlc2UgZGVmaW5pdGlvbnMuIChBZHVsdHMgZGlkIG5vdCBoYXZlIGFjY2VzcyB0byB0aGVzZSBkZWZpbml0aW9ucy4pCgpBZnRlciBjb21wbGV0aW5nIHRoZSAyMCBxdWVzdGlvbnMgYWJvdXQgbWVudGFsIGNhcGFjaXRpZXMsIGZvciBhIHN1YnNldCBvZiBwYXJ0aWNpcGFudHMgd2UgYWxzbyBhc2tlZCB0d28gYWRkaXRpb25hbCBxdWVzdGlvbnM6ICJJcyBhIFt0YXJnZXRdIG1hZGUgb3V0IG9mIG1ldGFsPyIgYW5kICJDYW4gYSBbdGFyZ2V0XSBiZSB0dXJuZWQgb24gYW5kIG9mZj8iIFRoZXNlIHF1ZXN0aW9ucyB3ZXJlIGFsd2F5cyBhc2tlZCBsYXN0LCBhbmQgd2VyZSBub3QgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgaW4gYW55IG9mIG91ciBwcmltYXJ5IGFuYWx5c2VzLiBTZWUgU09NIGZvciBhbiBhbmFseXNpcyBvZiByZXNwb25zZXMgdG8gdGhlc2UgcXVlc3Rpb25zLgoKIyMjIERhdGEgcHJvY2Vzc2luZwoKV2UgcGxhbm5lZCB0byBkcm9wIHRyaWFscyB3aXRoIHJlc3BvbnNlIHRpbWVzIHRoYXQgd2VyZSBmYXN0ZXIgdGhhbiBhIHByZXNldCBjcml0ZXJpb24gb2YgMjUwbXMsIGJ1dCB0aGVyZSB3ZXJlIG5vbmUgYW1vbmcgY2hpbGRyZW4sIGFuZCB3ZSBmYWlsZWQgdG8gcmVjb3JkIHJlc3BvbnNlIHRpbWVzIGFtb25nIGFkdWx0cy4gQXMgaW4gU3R1ZHkgMSwgd2UgcmV0YWluZWQgcGFydGljaXBhbnRzIHJlZ2FyZGxlc3Mgb2Ygc2tpcHBlZCB0cmlhbHMuIE92ZXJhbGwsIG5vbmUgb2YgYWR1bHRzIG9yIG9sZGVyIGNoaWxkcmVuJ3MgdHJpYWxzLCBhbmQgb25seSBgciByb3VuZChzdW0oaXMubmEoZDJfNDZfd2lkZSkpL3N1bSghaXMubmEoZDJfNDZfd2lkZSkpKjEwMCwgMilgJSBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgdHJpYWxzIChfbl89YHIgc3VtKGlzLm5hKGQyXzQ2X3dpZGUpKWApIHdlcmUgbWlzc2luZyBkYXRhLgoKRm9yIG91ciBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMsIHdlIGxvb2tlZCBhdCBlYWNoIGdyb3VwIG9mIHBhcnRpcGFudHMgKGFkdWx0cywgb2xkZXIgY2hpbGRyZW4sIGFuZCB5b3VuZ2VyIGNoaWxkcmVuKSBzZXBhcmF0ZWx5LCBiZWNhdXNlIEVGQSBpcyBhIGdyb3VwLWxldmVsIGFuYWx5c2lzIG9mIHRoZSBjb25zZW5zdWFsIGNvbmNlcHR1YWwgc3RydWN0dXJlIGFuZCBpcyBub3QgZGVzaWduZWQgdG8gbW9kZWwgY29udGludW91cyBwYXJ0aWNpcGFudC1sZXZlbCB2YXJpYWJsZXMgbGlrZSBleGFjdCBhZ2UuIE91ciBnb2FsIHdpdGggdGhlc2UgYW5hbHlzZXMgd2FzIHRvIGV4YW1pbmUgZGlzY3JldGUgInNuYXBzaG90cyIgb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhdCB0d28gcG9pbnRzIGluIHRoaXMgY29udGludW91cyBkZXZlbG9wbWVudGFsIHRyYWplY3RvcnkuCgojIyBSZXN1bHRzCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IEFkdWx0cwoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QyX2FkIDwtIGZhLnBhcmFsbGVsKGQyX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJG5mYWN0Cm5mYWN0X2JpY19kMl9hZCA8LSB2c3MoZDJfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSwgcGxvdCA9IEYpJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kMl9hZCA8LSByZXRlbl9mdW4oZDJfYWRfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDJfYWQsCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QyX2FkLAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kMl9hZCkKYGBgCgpgYGB7cn0KZWZhXzRfZDJfYWQgPC0gZmFfZnVuKGQyX2FkX3dpZGVfaSwgNCkKYGBgCgpBcyBpbiBTdHVkeSAxLCB0d28gb3Igb3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIChpbiB0aGlzIGNhc2UsIHBhcmFsbGVsIGFuYWx5c2lzIGFuZCBXZWlzbWFuIGV0IGFsLidzIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEpIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4gKE1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCByZXRhaW5pbmcgZm91ciBmYWN0b3JzLCBidXQgdGhlIGZvdXJ0aCBmYWN0b3Igd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIG9ubHkgYHIgdG9wX25fZG9tQ2FwKGVmYV80X2QyX2FkLCAyMCwgIkY0IiwgInBvcyIpICU+JSBsZW5ndGgoKWAgbWVudGFsIGNhcGFjaXR5OiBgciB0b3Bfbl9kb21DYXAoZWZhXzRfZDJfYWQsIDIwLCAiRjQiLCAicG9zIilgOyBzZWUgU09NLikKCmBgYHtyfQplZmFfM19kMl9hZCA8LSBmYV9mdW4oZDJfYWRfd2lkZV9pLCAzKQplZmFfM19wbG90X2QyX2FkIDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkFkdWx0cyAobj0iLCBucm93KGQyX2FkX3dpZGVfaSksICIpIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpBcyBleHBlY3RlZCwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYW5hbHlzaXMgYW1vbmcgYWR1bHRzIHdhcyBjaGFyYWN0ZXJpemVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gX0JPRFlfIChmaXJzdCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QyX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYxIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24pLCBfSEVBUlRfIChzZWNvbmQgZmFjdG9yLCBgciByb3VuZChlZmFfM19kMl9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHNoYXJlZCB2YXJpYW5jZSksIGFuZCBfTUlORF8gKHRoaXJkIGZhY3RvciwgYHIgcm91bmQoZWZhXzNfZDJfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiBzaGFyZWQgdmFyaWFuY2UpLiBTZWUgRmlndXJlIDUsIFBhbmVsIEQuCgpUaGlzIHN1Z2dlc3RzIHRoYXQgb3VyIG1vZGlmaWVkIGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtIHdhcyB2YWxpZDogVXNpbmcgYSBzaG9ydGVyIGxpc3Qgb2YgaXRlbXMgYW5kIGEgd2lkZXIgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgZWxpY2l0ZWQgdGhlIHNhbWUgaW50dWl0aXZlIG9udG9sb2d5IG9mIG1lbnRhbCBsaWZlLCBhbW9uZyBVUyBhZHVsdHMsIHRoYXQgd2FzIHJldmVhbGVkIGluIFN0dWR5IDEgYW5kIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHByZXZpb3VzIHdvcmsuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBPbGRlciBjaGlsZHJlbiAoNy05eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMl83OSA8LSBmYS5wYXJhbGxlbChkMl83OV93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSRuZmFjdApuZmFjdF9iaWNfZDJfNzkgPC0gdnNzKGQyXzc5X3dpZGVfaSwgY29yID0gY2hvc2VuX2Nvciwgcm90YXRlID0gY2hvc2VuX3JvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSR2c3Muc3RhdHMkQklDICU+JSB3aGljaC5taW4oKQpuZmFjdF93ZG1fZDJfNzkgPC0gcmV0ZW5fZnVuKGQyXzc5X3dpZGVfaSwgcm90X3R5cGUgPSBjaG9zZW5fcm90KQoKY2F0KCJQYXJhbGxlbCBhbmFseXNpczogIiwgbmZhY3RfcGFyX2QyXzc5LAogICAgIlxuTWluaW1pemluZyBCSUM6ICIsIG5mYWN0X2JpY19kMl83OSwKICAgICJcbldlaXNtYW4gZXQgYWwuOiAiLCBuZmFjdF93ZG1fZDJfNzkpCmBgYAoKYGBge3J9CmVmYV8zX2QyXzc5IDwtIGZhX2Z1bihkMl83OV93aWRlX2ksIDMpCgplZmFfM19wbG90X2QyXzc5IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk9sZGVyIGNoaWxkcmVuICg3LTl5LCBuPSIsIG5yb3coZDJfNzlfd2lkZV9pKSwgIikiKSkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpjb25nX2VmYV8zX2QyX2FkXzc5IDwtIGZhLmNvbmdydWVuY2UoZWZhXzNfZDJfNzkkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMl9hZCRsb2FkaW5ncykKYGBgCgpPdXIgdGhyZWUgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4gYWxsIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4gQXMgaW4gU3R1ZHkgMSwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYW5hbHlzaXMgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB3YXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzLCBhZ2FpbiBjaGFyYWN0ZXJpemVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfLgoKQWZ0ZXIgcm90YXRpb24sIHRoZSBmaXJzdCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjEiLCAiRjEiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMl83OSwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDJfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgc2Vjb25kIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjIiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMiIsICJGMSJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNzlbIkYyIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzc5LCA0LCAiRjIiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMiJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSB0aGlyZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjMiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjMiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMyIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMl83OSwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDJfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgNSwgUGFuZWwgQywgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKV2UgY29uc2lkZXIgdGhpcyB0byBiZSBhIGNsb3NlIGNvbmNlcHR1YWwgcmVwbGljYXRpb24gb2Ygb3VyIFN0dWR5IDEgZmluZGluZ3MsIHN1Z2dlc3RpbmcgdGhhdCBieSB0aGUgYWdlIG9mIDctOSB5ZWFycywgdGhpcyB0aHJlZS1wYXJ0IGNvbmNlcHR1YWwgc3RydWN0dXJlIGlzIHN0YWJsZSBhbmQgcm9idXN0IHRvIGEgcmFuZ2Ugb2YgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMuCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IFlvdW5nZXIgY2hpbGRyZW4gKDQtNnkpCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDJfNDYgPC0gZmEucGFyYWxsZWwoZDJfNDZfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkbmZhY3QKbmZhY3RfYmljX2QyXzQ2IDwtIHZzcyhkMl80Nl93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QyXzQ2IDwtIHJldGVuX2Z1bihkMl80Nl93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMl80NiwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDJfNDYsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QyXzQ2KQpgYGAKCmBgYHtyfQplZmFfMV9kMl80NiA8LSBmYV9mdW4oZDJfNDZfd2lkZV9pLCAxKQpgYGAKCk91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBlYWNoIHN1Z2dlc3RlZCByZXRhaW5pbmcgZGlmZmVyZW50IG51bWJlcnMgb2YgZmFjdG9yczogV2Vpc21hbiBldCBhbC4ncyBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHN1Z2dlc3RlZCByZXRhaW5pbmcgYHIgbmZhY3Rfd2RtX2QyXzQ2YCBmYWN0b3JzLCBwYXJhbGxlbCBhbmFseXNpcyBzdWdnZXN0ZWQgcmV0YWluaW5nIGByIG5mYWN0X3Bhcl9kMl80NmAgZmFjdG9ycywgYW5kIG1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCBhIG51bGwsIGByIG5mYWN0X2JpY19kMl80NmAtZmFjdG9yIHNvbHV0aW9uLiBIZXJlIHdlIHByZXNlbnQgYm90aCB0aGUgdHdvLSBhbmQgdGhyZWUtZmFjdG9yIHNvbHV0aW9ucy4gKFNlZSBTT00gZm9yIGZhY3RvciBsb2FkaW5ncyBvbiB0aGUgb25lICJmYWN0b3IiIGluIHRoZSBudWxsLCBvbmUtZmFjdG9yIHNvbHV0aW9uLCB3aGljaCB5aWVsZGVkIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgc3VjaCBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzFfZDJfNDYsIDQsICJGMSIpYC4pCgojIyMjIFRocmVlLWZhY3RvciBzb2x1dGlvbgoKYGBge3J9CmVmYV8zX2QyXzQ2IDwtIGZhX2Z1bihkMl80Nl93aWRlX2ksIDMpCgplZmFfM19wbG90X2QyXzQ2IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyXzQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkJPRFkqIiwgIk1JTkQiLCAiSEVBUlQqIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNDZfd2lkZV9pKSwgIik6IDMtZmFjdG9yIHNvbHV0aW9uIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KY29uZ19lZmFfM19kMl9hZF80NiA8LSBmYS5jb25ncnVlbmNlKGVmYV8zX2QyXzQ2JGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhXzNfZDJfYWQkbG9hZGluZ3MpCmBgYAoKSW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzIHJldGVudGlvbiBjcml0ZXJpYSwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgYXMgd2VsbCBhcyBzb21lIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYxIl1gKSwgYnV0IHdhcyBhbHNvIHF1aXRlIHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl80NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIG9uZSBjb21wbGV4IG5lZ2F0aXZlIGVtb3Rpb24gKF9mZWVsIGd1aWx0eV8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjIiLCAiRjEiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHRoaXJkIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLCB3aXRoIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjIiXWApLCBidXQgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYzIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIChTZWUgRmlndXJlIDUsIFBhbmVsIEIsIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLikKCldlIHdvdWxkIGRlc2NyaWJlIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYXMgcmVtaW5pc2NlbnQgb2YgdGhlIF9CT0RZXy1fSEVBUlRfLV9NSU5EXyBzdHJ1Y3R1cmUgZm91bmQgYW1vbmcgb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgYnV0IG5vdCBhcyBmdWxseSAiYWR1bHQtbGlrZS4iIEluIHBhcnRpY3VsYXIsIGluIHRoaXMgc3RydWN0dXJlLCB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgX0JPRFlfIGFtb25nIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMgYXJlIG5vdCBhcyBjbGVhcmx5IGRpZmZlcmVudGlhdGVkIGZyb20gdGhlIGVtb3Rpb25hbCBleHBlcmllbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIF9IRUFSVF8uIEluZGVlZCwgaXQgaXQgbm90IGNsZWFyIHRoYXQgX0JPRFlfIHZzLiBfSEVBUlRfIGlzIHRoZSBtb3N0IHNhbGllbnQgZGlzdGluY3Rpb24gYW1vbmcgdGhlIGZpcnN0IGFuZCB0aGlyZCBmYWN0b3JzIGluIHRoaXMgc29sdXRpb246IEEgY2xlYW5lciBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmYWN0b3JzIG1pZ2h0IGJlIG5lZ2F0aXZlbHktdmFsZW5jZWQgZXhwZXJpZW5jZXMgdnMuIHBvc2l0aXZlbHktdmFsZW5jZWQgZXhwZXJpZW5jZXMuIAoKIyMjIyBUd28tZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0KZWZhXzJfZDJfNDYgPC0gZmFfZnVuKGQyXzQ2X3dpZGVfaSwgMikKCmVmYV8yX3Bsb3RfZDJfNDYgPC0gaGVhdG1hcF9mdW4oZWZhXzJfZDJfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiQk9EWS1IRUFSVCIsICJNSU5EIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNDZfd2lkZV9pKSwgIik6IDItZmFjdG9yIHNvbHV0aW9uIikpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzJfZDJfYWRfNDYgPC0gZmEuY29uZ3J1ZW5jZShlZmFfMl9kMl80NiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QyX2FkJGxvYWRpbmdzKQpgYGAKCkluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCB0aGUgZmlyc3QgZmFjdG9yIGVuY29tcGFzc2VkIGJvdGggcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFuZCBlbW90aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMSJdYCksIGJ1dCB3YXMgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMsIGFzIHdlbGwgYXMgb25lIGNvbXBsZXggbmVnYXRpdmUgZW1vdGlvbiAoX2ZlZWwgZ3VpbHR5XykuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMiIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgNSwgUGFuZWwgQSwgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKSW4gcmVsYXRpb24gdG8gdGhlIF9CT0RZXy1fSEVBUlQtX01JTkRfIHN0cnVjdHVyZSBmb3VuZCBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCB3ZSB3b3VsZCBkZXNjcmliZSB0aGlzIHR3by1mYWN0b3Igc3RydWN0dXJlIGFzIGJlaW5nIGFuY2hvcmVkIGJ5IGEgY29udHJhc3QgYmV0d2VlbiB0aGUgY29nbml0aXZlIGNhcGFjaXRpZXMgb2YgdGhlIF9NSU5EXyB2cy4gYSBzZXQgb2Ygd2FybWVyLCBtb3JlIHZpc2VyY2FsIGV4cGVyaWVuY2VzIHRoYXQgY29uc3RpdHV0ZSBhIG1vcmUgaW50ZWdyYXRlZCByZXByZXNlbnRhdGlvbiBvZiBfQk9EWS1IRUFSVF8uCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAxfQpmaWcwNV9wbG90cyA8LSBwbG90X2dyaWQoZWZhXzJfcGxvdF9kMl80NiwgZWZhXzNfcGxvdF9kMl80NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19wbG90X2QyXzc5LCBlZmFfM19wbG90X2QyX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIpKQpmaWcwNV93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA1OiBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgcmVzdWx0cyBmb3IgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoQS1CKSwgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoQikgYW5kIGFkdWx0cyAoQykgaW4gU3R1ZHkgMiwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIG5pbmUgdGFyZ2V0IGNoYXJhY3RlcnM6IGEgY29tcHV0ZXIsIGEgcm9ib3QsIGEgZG9sbCwgYSB0ZWRkeSBiZWFyLCBhIGJlZXRsZSwgYSBiaXJkLCBhIG1vdXNlLCBhIGdvYXQsIG9yIGFuIGVsZXBoYW50LiBGb3IgeW91bmdlciBjaGlsZHJlbiwgd2UgaW5jbHVkZSBib3RoIHRoZSB0d28tZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBwYXJhbGxlbCBhbmFseXNpcyAoQSkgYW5kIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKEIpLiIsIDE0MyksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwNV93aXRoX2NhcHRpb24pCmBgYAoKIyMjIEF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZQoKSW4gU3R1ZHkgMSwgd2Ugc2F3IHRoYXQgZXZlbiBjaGlsZHJlbiBhcyBvbGQgYXMgNy05eeKAlHdob3NlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHNlZW1lZCB0byBiZSBxdWl0ZSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzJ+KAlG5vbmV0aGVsZXNzIGRpZmZlcmVkIGZyb20gYWR1bHRzIGluIHRoZWlyIF9hcHBsaWNhdGlvbl8gb2YgdGhpcyBjb25jZXB0LCBhdHRyaWJ1dGluZyBmYXIgbW9yZSBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgcmVsYXRlZCB0byB0aGUgX0hFQVJUXyB0byBib3RoIGJlZXRsZXMgYW5kIHJvYm90cy4gSG93IGRvIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBjb21wYXJlIHRvIGFkdWx0cyBmb3IgdGhlIGxhcmdlciBzZXQgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gU3R1ZHkgMuKAlGFuZCB3aGF0IGRvZXMgdGhpcyBhc3BlY3Qgb2YgY29uY2VwdHVhbCBkZXZlbG9wbWVudGFsIGxvb2sgbGlrZSBlYXJsaWVyIGluIGRldmVsb3BtZW50ICg0LTZ5KT8KCiMjIyMgRGlmZmVyZW5jZXMgYWNyb3NzIGFnZSBncm91cHMKCmBgYHtyfQpkMl9hbGxfd2lkZV9pIDwtIGQyX2FkX3dpZGVfaSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBmdWxsX2pvaW4oZDJfNzlfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBmdWxsX2pvaW4oZDJfNDZfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkX2NoYXIiKQpgYGAKCmBgYHtyfQplZmFfM19kMl83OV9wcm9qZWN0X3Njb3JlcyA8LSBwcmVkaWN0KG9iamVjdCA9IGVmYV8zX2QyX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkMl83OV93aWRlX2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmRhdGEgPSBkMl9hZF93aWRlX2kpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW43OSIpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtYyhzdWJpZCwgY2hhcmFjdGVyLCBzdWJpZF9jaGFyLCBhZ2VfZ3JvdXApKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpKSAlPiUKICBhcnJhbmdlKHN1YmlkX2NoYXIpCmBgYAoKYGBge3J9CmVmYV8zX2QyXzQ2X3Byb2plY3Rfc2NvcmVzIDwtIHByZWRpY3Qob2JqZWN0ID0gZWZhXzNfZDJfYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQyXzQ2X3dpZGVfaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQuZGF0YSA9IGQyX2FkX3dpZGVfaSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIl8uKiQiLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGNoYXJhY3RlciA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGFnZV9ncm91cCA9ICJjaGlsZHJlbjQ2IikgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIC1jKHN1YmlkLCBjaGFyYWN0ZXIsIHN1YmlkX2NoYXIsIGFnZV9ncm91cCkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIGFycmFuZ2Uoc3ViaWRfY2hhcikKYGBgCgpGb2xsb3dpbmcgU3R1ZHkgMSwgd2UgcHJvamVjdGVkIGFsbCBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcyBpbnRvIHRoZSBmYWN0b3Igc3BhY2UgZGVmaW5lZCBieSBhZHVsdHMgKHN0YW5kYXJkaXplZCBpbiB0ZXJtcyBvZiBhZHVsdHMnIHJlc3BvbnNlcyksIGFuZCBleGFtaW5lZCBmYWN0b3Igc2NvcmVzIGJ5IGFnZSBncm91cCAoYWdhaW4sIHVzaW5nIHRoZSBtZXRob2QgYXJ0aWN1bGF0ZWQgYnkgdGVuIEJlcmdlIGV0IGFsLiwgMTk5OSkuIEFzIGluIFN0dWR5IDEsIHRoaXMgeWllbGRlZCB0aHJlZSBzY29yZXMgZm9yIGVhY2ggcGFydGljaXBhbnQsIGNvcnJlc3BvbmRpbmcsIGluIHByaW5jaXBsZSwgdG8gaG9saXN0aWMganVkZ21lbnRzIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsLCBwaHlzaW9sb2dpY2FsLCBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZSBwYXJ0aWNpcGFudCBldmFsdWF0ZWQuIChOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSB0aHJlZSBzY29yZXMgdGFrZXMgaW50byBhY2NvdW50IGFkdWx0IGZhY3RvciBsb2FkaW5ncyBmb3IgYWxsIDIwIG1lbnRhbCBjYXBhY2l0aWVzLCBhcyBzaG93biBpbiBGaWd1cmUgNSwgUGFuZWwgRC4pIApUaGlzIGFsbG93ZWQgdXMgdG8gZXhhbWluZSB0aGUgZWZmZWN0cyBvZiBhZ2UgZ3JvdXAgKHlvdW5nZXIgY2hpbGRyZW4sIG9sZGVyIGNoaWxkcmVuLCBhZHVsdHMpLCBmYWN0b3IgKF9CT0RZXywgX0hFQVJUXywgX01JTkRfKSwgYW5kIHRhcmdldCBjaGFyYWN0ZXIgb24gdGhlc2Ugc2NvcmVzIHZpYSBtaXhlZCBlZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24uIEFzIGluIFN0dWR5IDEsIGZhY3RvciB3YXMgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIGdyb3VwIHdhcyBkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmUsIHRvIGFzc2VzcyB3aGV0aGVyIGNoaWxkcmVuIGluIGVhY2ggYWdlIGdyb3VwIHdlcmUgImFkdWx0LWxpa2UiIGluIHRoZWlyIGFzc2Vzc21lbnRzLiBUbyBleGFtaW5lIGRpZmZlcmVuY2VzIGluIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgdG8gZGlmZmVyZW50IHRhcmdldCBjaGFyYWN0ZXJzLCB3ZSBjb2RlZCBlYWNoIGNoYXJhY3RlciBhcyBlaXRoZXIgImFuaW1hdGUiIChlbGVwaGFudCwgZ29hdCwgbW91c2UsIGJpcmQsIGJlZXRsZSkgb3IgImluYW5pbWF0ZSIgKGNvbXB1dGVyLCByb2JvdCwgZG9sbCwgdGVkZHkgYmVhciksIGFuZCBpbmNsdWRlZCBhbmltYWN5IHN0YXR1cyAoZWZmZWN0LWNvZGVkKSBhcyBhIGZpeGVkIGVmZmVjdCBpbiBvdXIgcmVncmVzc2lvbiBtb2RlbC4gV2UgaW5jbHVkZWQgaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBpbmRpdmlkdWFsIGNoYXJhY3RlcnMgYXMgcmFuZG9tIGVmZmV0cyBpbiBvdXIgbW9kZWwsIGFsb25nIHdpdGggaW50ZXJjZXB0cyBmb3IgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMuW14xXQoKW14xXTogV2Ugbm90ZXMgdGhhdCB0aGUgY29tcGxleGl0aWVzIG9mIHRoZSBkZXNpZ24gb2YgU3R1ZHkgMiBjb3VsZCBsZW5kIHRoZW1zZWx2ZXMgdG8gbW9yZSBjb21wbGV4IG1vZGVscyB0aGFuIHdoYXQgd2UgaGF2ZSBwcmVzZW50ZWQgaGVyZSwgYW5kIHdlIGVuY291cmFnZSByZWFkZXJzIHRvIGV4YW1pbmUgYSBtb2RlbCBpbmNsdWRpbmcgbXVsdGlwbGUgY29tcGFyaXNvbnMgYmV0d2VlbiBzZXRzIG9mIGNoYXJhY3RlcnMgKGUuZy4sIG1hbW1hbHMgdnMuIG5vbi1tYW1tYWxzOyB0ZWNobm9sb2dpZXMgdnMuIHRveXMpIHByZXNlbnRlZCBpbiB0aGUgU09NLiBBbGwgb2YgdGhlIGVmZmVjdHMgZGVzY3JpYmVkIGJlbG93IGFsc28gaG9sZCB0cnVlIGluIHRoaXMgbW9yZSBjb21wbGV4IG1vZGVsLgoKVGhlIHJlc3VsdHMgb2YgdGhpcyBtb2RlbCBjYW4gYmUgZm91bmQgaW4gVGFibGUgMy4gCgpgYGB7cn0KZWZhXzNfc2NvcmVzX2QyX2FsbCA8LSBlZmFfM19kMl9hZCRzY29yZXMgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3ViaWRfY2hhcikgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiX2NvbXB1dGVyIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl9yb2JvdCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX2RvbGwiLCAiIiwgc3ViaWQpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl90ZWRkeV9iZWFyIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfYmVldGxlIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfYmlyZCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX21vdXNlIiwgIiIsIHN1YmlkKSwKICAgICAgICAgc3ViaWQgPSBnc3ViKCJfZ29hdCIsICIiLCBzdWJpZCksCiAgICAgICAgIHN1YmlkID0gZ3N1YigiX2VsZXBoYW50IiwgIiIsIHN1YmlkKSwKICAgICAgICAgY2hhcmFjdGVyID0gZ3N1YigiXi4qXyIsICIiLCBzdWJpZF9jaGFyKSwKICAgICAgICAgYWdlX2dyb3VwID0gImFkdWx0cyIsCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKGVmYV8zX2QyXzc5X3Byb2plY3Rfc2NvcmVzICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2VfZ3JvdXAsIGFnZSkpKSAlPiUKICBmdWxsX2pvaW4oZWZhXzNfZDJfNDZfcHJvamVjdF9zY29yZXMgJT4lIAogICAgICAgICAgICAgIGxlZnRfam9pbihkMl80NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZV9ncm91cCwgYWdlKSkpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYmVhciIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSB+ICJ0ZWRkeSBiZWFyIiwgCiAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIiksIGNoYXJhY3RlciwgYWdlX2dyb3VwKSwgZnVucyhmYWN0b3IpKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgImRvbGwiLCAidGVkZHkgYmVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsICJtb3VzZSIsICJnb2F0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZXBoYW50IikpLAogICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY2hpbGRyZW40NiIsICJjaGlsZHJlbjc5IiwgImFkdWx0cyIpKSkKCmVmYV8zX3Njb3Jlc19ib290X2QyX2FsbCA8LSBlZmFfM19zY29yZXNfZDJfYWxsICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgZmFjdG9yLCBmYWN0b3JfbmFtZSwgY2hhcmFjdGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QyX2FsbCRjaGFyYWN0ZXIpIDwtIGNiaW5kKAogICJhbmltX2luYW4iID0gYygtNSwgLTUsIC01LCAtNSwgNCwgNCwgNCwgNCwgNCksCiAgIm1hbW1fbm9ubSIgPSBjKDAsIDAsIDAsIDAsIC0zLCAtMywgMiwgMiwgMiksCiAgImVsZXBfZ29tbyIgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAtMSwgMiksCiAgImdvYXRfbW91cyIgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAxLCAwKSwKICAiYmlyZF9iZWV0IiA9IGMoMCwgMCwgMCwgMCwgLTEsIDEsIDAsIDAsIDApLAogICJ0ZWNoX3RveXMiID0gYygxLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDApLAogICJyb2JvX2NvbXAiID0gYygtMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCksCiAgInRlZGRfZG9sbCIgPSBjKDAsIDAsIC0xLCAxLCAwLCAwLCAwLCAwLCAwKSkKY29udHJhc3RzKGVmYV8zX3Njb3Jlc19kMl9hbGwkYWdlX2dyb3VwKSA8LSBjYmluZCgiQ0g0Nl9BRCIgPSBjKDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSDc5X0FEIiA9IGMoMCwgMSwgMCkpCmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDJfYWxsJGZhY3Rvcl9uYW1lKSA8LSBjYmluZCgiSF9HTSIgPSBjKC0xLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoLTEsIDAsIDEpKQoKIyBlZmFfM19zY29yZXNfcl9kMl9hbGwgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2VfZ3JvdXAgKiBjaGFyYWN0ZXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDF8c3ViaWQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kMl9hbGwsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMTIzNDUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpKQojIHNhdmVSRFMoZWZhXzNfc2NvcmVzX3JfZDJfYWxsLCBmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDJfYWxsLnJkcyIpCgplZmFfM19zY29yZXNfcl9kMl9hbGwgPC0gcmVhZFJEUyhmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDJfYWxsLnJkcyIpCiMgc3VtbWFyeShlZmFfM19zY29yZXNfcl9kMl9hbGwpCmBgYAoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgZnVsbCBtb2RlbAojIGZpeGVmKGVmYV8zX3Njb3Jlc19yX2QyX2FsbCkgJT4lIAojICAgZGF0YS5mcmFtZSgpICU+JQojICAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKFBhcmFtZXRlciwKIyAgICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAojICAgICAiY2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiMgICAgICJjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnM6IG1hbW1hbHMgdnMuIG90aGVyIGFuaW1hbHMiLAojICAgICAiY2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzOiBlbGVwaGFudCB2cy4gb3RoZXIgbWFtbWFscyIsCiMgICAgICJjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnM6IGdvYXQgdnMuIG1vdXNlIiwKIyAgICAgImNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVyczogYmlyZCB2cy4gYmVldGxlIiwKIyAgICAgImNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVyczogdGVjaG5vbG9naWVzIHZzLiB0b3lzIiwKIyAgICAgImNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVyczogcm9ib3QgdnMuIGNvbXB1dGVyIiwKIyAgICAgImNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVyczogdGVkZHkgYmVhciB2cy4gZG9sbCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRCIgPSAiYWdlIGdyb3VwICg0LTZ5IHZzLiBhZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQiID0gImFnZSBncm91cCAoNy05eSB2cy4gYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgSEVBUlQiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIEhFQVJUIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgSEVBUlQiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIE1JTkQiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgTUlORCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBNSU5EIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgTUlORCIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJlbGVwX2dvbW8iID0gImNoYXJhY3RlcnMgKGVsZXBoYW50L290aGVyIG1hbW1hbHMpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVydGVjaF90b3lzIiA9ICJjaGFyYWN0ZXJzICh0ZWNobm9sb2dpZXMvdG95cykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQiID0gIkhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyZ29hdF9tb3VzIiA9ICJjaGFyYWN0ZXJzIChnb2F0L21vdXNlKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJyb2JvX2NvbXAiID0gImNoYXJhY3RlcnMgKHJvYm90L2NvbXB1dGVyKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3Rlcm1hbW1fbm9ubSIgPSAiY2hhcmFjdGVycyAobWFtbWFscy9vdGhlciBhbmltYWxzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmVsZXBfZ29tbyIgPSAiY2hhcmFjdGVycyAoZWxlcGhhbnQvb3RoZXIgbWFtbWFscykgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYmlyZF9iZWV0IiA9ICJjaGFyYWN0ZXJzIChiaXJkL2JlZXRsZSkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJ0ZWNoX3RveXMiID0gImNoYXJhY3RlcnMgKHRlY2hub2xvZ2llcy90b3lzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVydGVkZF9kb2xsIiA9ICJjaGFyYWN0ZXJzICh0ZWRkeSBiZWFyL2RvbGwpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJtYW1tX25vbm0iID0gImNoYXJhY3RlcnMgKG1hbW1hbHMvb3RoZXIgYW5pbWFscykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzIChlbGVwaGFudC9vdGhlciBtYW1tYWxzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJnb2F0X21vdXMiID0gImNoYXJhY3RlcnMgKGdvYXQvbW91c2UpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmJpcmRfYmVldCIgPSAiY2hhcmFjdGVycyAoYmlyZC9iZWV0bGUpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVycyAodGVjaG5vbG9naWVzL3RveXMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnJvYm9fY29tcCIgPSAiY2hhcmFjdGVycyAocm9ib3QvY29tcHV0ZXIpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlZGRfZG9sbCIgPSAiY2hhcmFjdGVycyAodGVkZHkgYmVhci9kb2xsKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVybWFtbV9ub25tIiA9ICJjaGFyYWN0ZXJzIChtYW1tYWxzL290aGVyIGFuaW1hbHMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyZWxlcF9nb21vIiA9ICJjaGFyYWN0ZXJzIChlbGVwaGFudC9vdGhlciBtYW1tYWxzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmdvYXRfbW91cyIgPSAiY2hhcmFjdGVycyAoZ29hdC9tb3VzZSkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJiaXJkX2JlZXQiID0gImNoYXJhY3RlcnMgKGJpcmQvYmVldGxlKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcnRlY2hfdG95cyIgPSAiY2hhcmFjdGVycyAodGVjaG5vbG9naWVzL3RveXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVycm9ib19jb21wIiA9ICJjaGFyYWN0ZXJzIChyb2JvdC9jb21wdXRlcikgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJ0ZWRkX2RvbGwiID0gImNoYXJhY3RlcnMgKHRlZGR5IGJlYXIvZG9sbCkgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIpKSAlPiUKIyAgIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKIyAgIG11dGF0ZShYID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+IDAsICIqIiwgIiIpKSAlPiUKIyAgIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwgCiMgICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiMgICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiMgICB1bml0ZShgOTUlIENJYCwgUTIuNSwgUTk3LjUsIHNlcCA9ICIsICIpICU+JQojICAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQojICAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAojICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgMzogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIHByZWRpY3RpbmcgZmFjdG9yIHNjb3JlcyBpbiBTdHVkeSAyIGJ5IGNoYXJhY3RlciwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBhZ2UgZ3JvdXAuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgZ3JvdXAgKiBjaGFyYWN0ZXIgKyAoMSB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBGYWN0b3Igd2FzIGVmZmVjdC1jb2RlZDsgYWdlLWdyb3VwIHdhcyBkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmU7IGFuZCBjaGFyYWN0ZXIgd2FzIGNvZGVkIHdpdGggZWlnaHQgb3J0aG9nb25hbCBjb250cmFzdHMgKHNlZSBtYWluIHRleHQpLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiMgICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgcmVzdWx0cyA9ICJhc2lzIiwgaW5jbHVkZSA9IFR9CiMgIyBzdWJzZXQgb2YgbW9kZWwKIyBmaXhlZihlZmFfM19zY29yZXNfcl9kMl9hbGwpICU+JQojICAgZGF0YS5mcmFtZSgpICU+JQojICAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKIyAgIGZpbHRlcihQYXJhbWV0ZXIgIT0gIkludGVyY2VwdCIsCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJtYW1tX25vbm0iLCBQYXJhbWV0ZXIpLAojICAgICAgICAgICFncmVwbCgiY2hhcmFjdGVyZWxlcF9nb21vIiwgUGFyYW1ldGVyKSwKIyAgICAgICAgICAhZ3JlcGwoImNoYXJhY3RlcmdvYXRfbW91cyIsIFBhcmFtZXRlciksCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJiaXJkX2JlZXQiLCBQYXJhbWV0ZXIpLAojICAgICAgICAgICFncmVwbCgiY2hhcmFjdGVydGVjaF90b3lzIiwgUGFyYW1ldGVyKSwKIyAgICAgICAgICAhZ3JlcGwoImNoYXJhY3RlcnJvYm9fY29tcCIsIFBhcmFtZXRlciksCiMgICAgICAgICAgIWdyZXBsKCJjaGFyYWN0ZXJ0ZWRkX2RvbGwiLCBQYXJhbWV0ZXIpKSAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKAojICAgICBQYXJhbWV0ZXIsCiMgICAgICMgQURVTFRTCiMgICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAojICAgICAiY2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIiwKIyAgICAgIyBPTERFUiBDSElMRFJFTgojICAgICAiYWdlX2dyb3VwQ0g3OV9BRCIgPSAiYWdlIGdyb3VwICg3LTl5IHZzLiBhZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJhZ2VfZ3JvdXBDSDc5X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g3OV9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAojICAgICAjIFlPVU5HRVIgQ0hJTERSRU4KIyAgICAgImFnZV9ncm91cENINDZfQUQiID0gImFnZSBncm91cCAoNC02eSB2cy4gYWR1bHRzKSIsCiMgICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJhbmltX2luYW4iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKIyAgICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlcmFuaW1faW5hbiIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAojICAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyYW5pbV9pbmFuIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIikpICU+JQojICAgYXJyYW5nZShQYXJhbWV0ZXIpICU+JQojICAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQojICAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAojICAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpICU+JQojICAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQojICAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKIyAgIG11dGF0ZShgOTUlIENJYCA9IHBhc3RlMCgiWyIsIGA5NSUgQ0lgLCAiXSIpKSAlPiUKIyAgIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKIyAgICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IEEgc3Vic2V0IG9mIHRoZSBmaXhlZCBlZmZlY3RzIGZyb20gYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gbW9kZWwgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDIgYnkgY2hhcmFjdGVyLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGFnZSBncm91cC4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSBncm91cCAqIGNoYXJhY3RlciArICgxIHwgc3ViamVjdCknIGFuZCB3YXMgaW1wbGVtZW50ZWQgaW4gdGhlICdicm1zJyBwYWNrYWdlIGZvciBSIChCw7xya25lciwgMjAxNykuIEZhY3RvciB3YXMgZWZmZWN0LWNvZGVkOyBhZ2UtZ3JvdXAgd2FzIGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZTsgYW5kIGNoYXJhY3RlciB3YXMgY29kZWQgd2l0aCBlaWdodCBvcnRob2dvbmFsIGNvbnRyYXN0cyAoc2VlIG1haW4gdGV4dCkuIEhlcmUgd2UgaGF2ZSBpbmNsdWRlZCBvbmx5IGEgc3Vic2V0IG9mIHBhcmFtZXRlciBvZiBzdHJvbmcgdGhlb3JldGljYWwgaW50ZXJlc3Q7IHNlZSBTT00gZm9yIHRoZSBmdWxsIG1vZGVsLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiMgICBrYWJsZV9zdHlsaW5nKCkgJT4lCiMgICBncm91cF9yb3dzKCJBZHVsdHMiLCAxLCA1KSAlPiUKIyAgIGdyb3VwX3Jvd3MoIk9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLCA2LCAxMSkgJT4lCiMgICBncm91cF9yb3dzKCJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLCAxMiwgMTcpCmBgYAoKYGBge3J9CmQyX2FuaW0gPC0gZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUKICBtdXRhdGUoYW5pbV9pbmFuID0gY2FzZV93aGVuKAogICAgY2hhcmFjdGVyICVpbiUgYygiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLCAiZ29hdCIsICJlbGVwaGFudCIpIH4gImFuaW1hdGUiLAogICAgY2hhcmFjdGVyICVpbiUgYygiY29tcHV0ZXIiLCAicm9ib3QiLCAiZG9sbCIsICJ0ZWRkeSBiZWFyIikgfiAiaW5hbmltYXRlIikpICU+JQogIG11dGF0ZShhbmltX2luYW4gPSBmYWN0b3IoYW5pbV9pbmFuLCBsZXZlbHMgPSBjKCJpbmFuaW1hdGUiLCAiYW5pbWF0ZSIpKSkKCmNvbnRyYXN0cyhkMl9hbmltJGFnZV9ncm91cCkgPC0gY2JpbmQoIkNINDZfQUQiID0gYygxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0g3OV9BRCIgPSBjKDAsIDEsIDApKQpjb250cmFzdHMoZDJfYW5pbSRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkhfR00iID0gYygtMSwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTV9HTSIgPSBjKC0xLCAwLCAxKSkKY29udHJhc3RzKGQyX2FuaW0kYW5pbV9pbmFuKSA8LSBjYmluZCgiYW5pbV9HTSIgPSBjKC0xLCAxKSkKCiMgZDJfYW5pbV9yIDwtIGJybShzY29yZSB+IGZhY3Rvcl9uYW1lICogYW5pbV9pbmFuICogYWdlX2dyb3VwICsgCiMgICAgICAgICAgICAgICAoMSB8IHN1YmlkKSArCiMgICAgICAgICAgICAgICAoMSArIGZhY3Rvcl9uYW1lICsgYWdlX2dyb3VwIHwgY2hhcmFjdGVyKSwKIyAgICAgICAgICAgICBkYXRhID0gZDJfYW5pbSwKIyAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpLAojICAgICAgICAgICAgIGNvcmVzID0gNCkKIyBzYXZlUkRTKGQyX2FuaW1fciwgZmlsZSA9ICIuL2JybXNfbW9kZWxzL2QyX2FuaW1fci5yZHMiKQoKZDJfYW5pbV9yIDwtIHJlYWRSRFMoIi4vYnJtc19tb2RlbHMvZDJfYW5pbV9yLnJkcyIpCiMgc3VtbWFyWShkMl9hbmltX3IpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCByZXN1bHRzID0gImFzaXMifQpmaXhlZihkMl9hbmltX3IpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIlBhcmFtZXRlciIpICU+JQogIG11dGF0ZShQYXJhbWV0ZXIgPSByZWNvZGVfZmFjdG9yKAogICAgUGFyYW1ldGVyLAogICAgIyBBRFVMVFMKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJhbmltX2luYW5hbmltX0dNIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR00iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiAgICAjIE9MREVSIENISUxEUkVOCiAgICAiYWdlX2dyb3VwQ0g3OV9BRCIgPSAiYWdlIGdyb3VwICg3LTl5IHZzLiBhZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiSEVBUlQgw5cgYWdlIGdyb3VwICg3LTl5L2FkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJNSU5EIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKICAgICJhbmltX2luYW5hbmltX0dNOmFnZV9ncm91cENINzlfQUQiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIGFnZSBncm91cCAoNy05eS9hZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZUhfR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDc5X0FEIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBIRUFSVCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g3OV9BRCIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCDDlyBhZ2UgZ3JvdXAgKDctOXkvYWR1bHRzKSIsCiAgICAjIFlPVU5HRVIgQ0hJTERSRU4KICAgICJhZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJhZ2UgZ3JvdXAgKDQtNnkgdnMuIGFkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAgKDQtNnkvYWR1bHRzKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAogICAgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgYWdlIGdyb3VwICg0LTZ5L2FkdWx0cykiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNOmFnZV9ncm91cENINDZfQUQiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDQ2X0FEIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBNSU5EIMOXIGFnZSBncm91cCAoNC02eS9hZHVsdHMpIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBwcmVkaWN0aW5nIGZhY3RvciBzY29yZXMgaW4gU3R1ZHkgMiBieSBhbmltYWN5IHN0YXR1cyAoYW5pbWF0ZXMsIGluYW5pbWF0ZXMpLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EKSwgYW5kIGFnZSBncm91cCAoNC02eSwgNy05eSwgYWR1bHRzKS4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSBncm91cCAqIGFuaW1hY3kgKyAoMSB8IHN1YmplY3QpICsgKDEgKyBmYWN0b3IgKyBhZ2UgZ3JvdXAgfCBjaGFyYWN0ZXIpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBBbmltYWN5IHN0YXR1cyBhbmQgZmFjdG9yIHdlcmUgZWZmZWN0LWNvZGVkOyBhZ2UtZ3JvdXAgd2FzIGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZS4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJBZHVsdHMiLCAxLCA2KSAlPiUKICBncm91cF9yb3dzKCI3LTl5IHZzLiBhZHVsdHMiLCA3LCAxMikgJT4lCiAgZ3JvdXBfcm93cygiNC02eSB2cy4gYWR1bHRzIiwgMTMsIDE4KQpgYGAKCkJ5IGRlZmluaXRpb24sIGFkdWx0cycgZmFjdG9yIHNjb3JlcyBkaWQgbm90IGRpZmZlciBhY3Jvc3MgZmFjdG9ycyAoSEVBUlQgdnMuIGdyYW5kIG1lYW46IGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNIilgOyBNSU5EIHZzLiBncmFuZCBtZWFuOiBgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lTV9HTSIpYCkuIEFzIHdlIHdvdWxkIGV4cGVjdCwgYWR1bHRzIGF0dHJpYnV0ZWQgbW9yZSBtZW50YWwgY2FwYWNpdGllcyAoY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycykgdG8gYW5pbWF0ZXMgdGhhbiBpbmFuaW1hdGVzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR00iKWAp4oCUYSBkaWZmZXJlbmNlIHRoYXQgd2FzIGRpbWluaXNoZWQgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNIilgKSwgYnV0IG5vdCBzdWJzdGFudGlhbGx5IGRpbWluaXNoZWQgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR00iKWApLgoKQXMgYSBncm91cCwgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZGlkIG5vdCBkaWZmZXIgZnJvbSBhZHVsdHMsIGNvbGxhcHNpbmcgY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycyBhbmQgY2hhcmFjdGVycyAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJhZ2VfZ3JvdXBDSDc5X0FEIilgKeKAlGJ1dCB0aGlzIG1hc2tzIHNldmVyYWwgaW1wb3J0YW50IGRpZmZlcmVuY2VzIGJldHdlZW4gb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cy4gQXMgaW4gU3R1ZHkgMSwgb2xkZXIgY2hpbGRyZW4ncyBzY29yZXMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IGEgcmVsYXRpdmUgb3Zlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKSwgYW5kIGEgcmVsYXRpdmUgdW5kZXItYXR0cmlidXRpb24gb2YgYWJpbGl0aWVzIGluIHRoZSBfTUlORF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKS4gQ29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycywgb2xkZXIgY2hpbGRyZW4gbWFkZSBsZXNzIG9mIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBhbmltYXRlIGFuIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycywgcmVsYXRpdmUgdG8gYWR1bHRzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g3OV9BRCIpYCkuIFRoaXMgcmVsYXRpdmUgdW5kZXItZGlmZmVyZW50aWF0aW9uIG9mIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSBjaGFyYWN0ZXJzIHdhcyBwYXJ0aWN1bGFybHkgcHJvbm91bmNlZCBpbiB0aGUgX01JTkRfIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDc5X0FEIilgKS4KCkhvdyBkaWQgeW91bmdlciBjaGlsZHJlbiBjb21wYXJlIHRvIGFkdWx0cz8gQXMgYSBncm91cCwgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZGlkIG5vdCBkaWZmZXIgZnJvbSBhZHVsdHMsIGNvbGxhcHNpbmcgY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycyBhbmQgY2hhcmFjdGVycyAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJhZ2VfZ3JvdXBDSDQ2X0FEIilgKeKAlGJ1dCBhZ2FpbiwgdGhpcyBtYXNrcyBhIHZhcmlldHkgb2YgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcyB0aGF0IGdlbmVyYWxseSBwYXJhbGxlbCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGp1c3QgZGVzY3JpYmVkLiBNdWNoIGxpa2Ugb2xkZXIgY2hpbGRyZW4sIHlvdW5nZXIgY2hpbGRyZW4ncyBzY29yZXMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IGEgcmVsYXRpdmUgb3Zlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKSBhbmQgYSByZWxhdGl2ZSB1bmRlci1hdHRyaWJ1dGlvbiBvZiBhYmlsaXRpZXMgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiKWApLCBhbmQgdGhleSBkaWZmZXJlbnRpYXRlZCBsZXNzIGJldHdlZW4gYW5pbWF0ZSBhbiBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgdGhhbiBkaWQgYWR1bHRzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGQyX2FuaW1fciwgImFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIpYCkuIFRoaXMgcmVsYXRpdmUgdW5kZXItZGlmZmVyZW50aWF0aW9uIG9mIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSBjaGFyYWN0ZXJzIHdhcyBwYXJ0aWN1bGFybHkgcHJvbm91bmNlZCBpbiB0aGUgX01JTkRfIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl9hbmltX3IsICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKSwgYW5kIGxlc3MgcHJvbm91bmNlZCBpbiB0aGUgX0hFQVJUXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR006YWdlX2dyb3VwQ0g0Nl9BRCIpYCkuCgpgYGB7cn0KZmlnMDZhX3Bsb3QgPC0gZDJfYW5pbSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIGZhY3Rvcl9uYW1lLCBhbmltX2luYW4pICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcighaXMubmEoYW5pbV9pbmFuKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9IHJlY29kZV9mYWN0b3IoYWdlX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjQ2IiA9ICI0LTZ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIiksCiAgICAgICAgIGFuaW1faW5hbiA9IHJlY29kZV9mYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmFuaW1hdGUiID0gImluYW5pbWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlIiA9ICJhbmltYXRlcyIpLAogICAgICAgICBmYWNldF9sYWIgPSAiYW5pbWF0ZXMgdnMuIGluYW5pbWF0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2VfZ3JvdXAsIGdyb3VwID0gYW5pbV9pbmFuLAogICAgICAgICAgICAgeSA9IG1lYW4sIGNvbG9yID0gYW5pbV9pbmFuKSkgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3Rvcl9uYW1lKSwgY29scyA9IHZhcnMoZmFjZXRfbGFiKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJzbGF0ZWdyZXkiLCAiZmlyZWJyaWNrMSIpLCBuYS52YWx1ZSA9ICJncmF5IikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gImZhY3RvciBzY29yZSIsIGNvbG9yID0gImFuaW1hY3kiKQpgYGAKCmBgYHtyfQpmaWcwNmJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2Jvb3RfZDJfYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfYWxsX2NoYXIgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBnc3ViKCJfIiwgIiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHMiID0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb21wdXRlciIsICJyb2JvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9sbCIsICJ0ZWRkeSBiZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2UiLCAiZ29hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxlcGhhbnQiKSkpLAogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBtZWFuLCBjb2xvciA9IGNoYXJhY3RlcikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3Rvcl9uYW1lKSwgY29scyA9IHZhcnMoY2hhcmFjdGVyKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjaGFyYWN0ZXIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAgICAgICAgICAgICAgICAgIyBmYXR0ZW4gPSAzLCBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2xhYmVsKGFlcyhsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSwgeSA9IGNpX2xvd2VyKSwgCiAgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwgYWxwaGEgPSAwLjgsIAogICAgICAgICAgICAgbnVkZ2VfeSA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeCA9ICJhZ2UgZ3JvdXAiLCB5ID0gIiIsIGNvbG9yID0gImNoYXJhY3RlciIpCmBgYAoKYGBge3J9CmZpZzA2X3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwNmFfcGxvdCwgZmlnMDZiX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwgcmVsX3dpZHRocyA9IGMoMC4xNSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA5LCBmaWcuYXNwID0gMC41fQpmaWcwNl93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNl9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA2OiBGYWN0b3Igc2NvcmVzIGZvciB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5KSwgb2xkZXIgY2hpbGRyZW4gKDctOXkpLCBhbmQgYWR1bHRzIGluIFN0dWR5IDIsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMjAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiBuaW5lIHRhcmdldCBjaGFyYWN0ZXJzLiBFYWNoIHBhcnRpY2lwYW50IHJlY2lldmVkIGEgZmFjdG9yIHNjb3JlIGZvciBlYWNoIGZhY3RvciAoQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcyBkZWZpbmVkIGJ5IGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcykuIFdlIHRyZWF0ZWQgdGhlc2Ugc2NvcmVzIGFzIHN1bW1hcmllcyBvZiB0aGF0IHBhcnRpY2lwYW50cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbiB0aGVzZSBkb21haW5zOyBhIHNjb3JlIG9mIDAgY29ycmVzcG9uZHMgdG8gdGhlIG1lYW4gZm9yIHRoYXQgZmFjdG9yIGFtb25nIGFkdWx0cy4gV2UgcHJlc2VudCB0d28gd2F5cyBvZiBsb29raW5nIGF0IHRoZXNlIGRhdGE6IGNvbGxhcHNpbmcgY2hhcmFjdGVycyBpbnRvIGFuaW1hdGVzIChiZWV0bGUsIGJpcmQsIG1vdXNlLCBnb2F0LCBlbGVwaGFudCkgdnMuIGluYW5pbWF0ZXMgKGNvbXB1dGVyLCByb2JvdCwgZG9sbCwgdGVkZHkgYmVhcjsgUGFuZWwgQSk7IGFuZCBleGFtaW5pbmcgZWFjaCBjaGFyYWN0ZXIgaW5kaXZpZHVhbGx5IChQYW5lbCBCKS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscy4gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB0aGUgeS1heGlzIGRpZmZlcnMgYWNyb3NzIHJvd3MuIiwgMjEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzA2X3dpdGhfY2FwdGlvbikKYGBgCgpBIHZpc3VhbCBpbnNwZWN0aW9uIG9mIEZpZ3VyZSA2IGZ1cnRoZXIgY2xhcmlmaWVzIHRoZXNlIGZpbmRpbmdzLiAKCkluIHRoZSBfQk9EWV8gZG9tYWluLCBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZSBhbmQgaW5hbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzIHdhcyBjbGVhcmx5IHByZXNlbnQgaW4gYWxsIGFnZSBncm91cHMsIHRob3VnaCBzbGlnaHRseSBhdHRlbnVhdGVkIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gKHNlZSBGaWd1cmUgNiwgUGFuZWwgQSwgdG9wIHJvdykuIEEgY2xvc2VyIGxvb2sgYXQgZmFjdG9yIHNjb3JlcyBmb3IgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIChQYW5lbCBCLCB0b3Agcm93KSBzdWdnZXN0cyB0aGF0IHlvdW5nZXIgY2hpbGRyZW4gZGl2ZXJnZWQgZnJvbSBhZHVsdHMgcHJpbWFyaWx5IGluIHRoZWlyIGF0dHJpYnV0aW9ucyB0byB0aGUgImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSB0aGUgZm9jdXMgb2YgU3R1ZHkgMTogdGhlIHJvYm90ICh0byB3aGljaCB0aGV5IG92ZXItYXR0cmlidXRlZCB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIHJlbGF0ZWQgdG8gdGhlIF9CT0RZXyksIGFuZCB0aGUgYmVldGxlICh0byB3aGljaCB0aGV5IHVuZGVyLWF0dHJpYnV0ZWQgc3VjaCBfQk9EWV8gY2FwYWNpdGllcykuIE9sZGVyIGNoaWxkcmVuJ3MgX0JPRFlfIGF0dHJpYnV0aW9ucyB3ZXJlIGdlbmVyYWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFkdWx0cycgZm9yIGFsbW9zdCBhbGwgdGFyZ2V0IGNoYXJhY3RlcnMuIChUaGUgb25seSBwb3NzaWJsZSBleGNlcHRpb24gaXMgdGhlIGJpcmTigJRidXQsIGluIG91ciB2aWV3LCBpdCBhcHBlYXJzIHRoYXQgdGhpcyB3YXMgZHJpdmVuIGJ5IF9hZHVsdHNfIHNsaWdodGx5IF91bmRlcl8tYXR0cmlidXRpbmcgX0JPRFlfIGNhcGFjaXRpZXMgdG8gdGhpcyBjaGFyYWN0ZXIuKQoKSW4gdGhlIF9IRUFSVF8gZG9tYWluLCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhbmltYXRlIGFuZCBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIHN1YnRsZXIgYWNyb3NzIGFsbCBhZ2UgZ3JvdXBzLCBhbmQgdGhlIGRlZ3JlZSBvZiBkaXN0aW5jdGlvbiBkaWQgbm90IHZhcnkgZHJhbWF0aWNhbGx5IHdpdGggYWdlIChzZWUgRmlndXJlIDYsIFBhbmVsIEEsIG1pZGRsZSByb3cpLiBJbnN0ZWFkLCBjaGlsZHJlbiBnZW5lcmFsbHkgb3Zlci1hdHRyaWJ1dGVkIF9IRUFSVF8gdG8gX2JvdGhfIGFuaW1hdGVzIGFuZCBpbmFuaW1hdGVzOyB0aGVzZSBvdmVyLWF0dHJpYnV0aW9ucyBkZWNsaW5lZCBiZXR3ZWVuIDQtNnkgYW5kIDctOXkgb2YgYWdlLCBidXQgZGlkIG5vdCByZWFjaCBhZHVsdC1saWtlIGxldmVscyBldmVuIGFtb25nIG9sZGVyIGNoaWxkcmVuLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBTdHVkeSAxLCBpbiB3aGljaCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIG92ZXItYXR0cmlidXRlZCBfSEVBUlRfIHRvIGJvdGggdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90LCByZWxhdGl2ZSB0byBhZHVsdHMuIEluIHRoaXMgc3R1ZHksIG9sZGVyIGNoaWxkcmVuIGFnYWluIGF0dHJpYnV0ZWQgbW9yZSBfSEVBUlRfIGNhcGFjaXRpZXMgdG8gdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90LCBidXQgYWxzbyB0byB0aGUgbW91c2UgYW5kIHRoZSBnb2F0IChzZWUgUGFuZWwgQiwgbWlkZGxlIHJvdykuIFJlbGF0aXZlIHRvIG90aGVyIGFuaW1hdGVzLCBhZHVsdHMgYXR0cmlidXRlZCBwYXJ0aWN1bGFybHkgZmV3IF9IRUFSVF8gY2FwYWNpdGllcyB0byB0aGUgbW91c2UgYW5kIHRoZSBnb2F04oCUcGVyaGFwcyBiZWNhdXNlIG9mIHRoZWlyIHJlc3BlY2l2ZSBzdGF0dXNlcyBhcyB2ZXJtaW4gYW5kIGZvb2QgYW5pbWFscyBpbiB0aGlzIGN1bHR1cmFsIGNvbnRleHQuCgpGaW5hbGx5LCBpbiB0aGUgX01JTkRfIGRvbWFpbiwgbmVpdGhlciBncm91cCBvZiBjaGlsZHJlbiBtYWRlIGEgcm9idXN0IGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZXMgYW5kIGluYW1hdGVz4oCUYnV0IGFkdWx0cyBjbGVhcmx5IGRpZCAoc2VlIEZpZ3VyZSA2LCBQYW5lbCBBLCBib3R0b20gcm93KS4gSW5zdGVhZCwgY2hpbGRyZW4gZ2VuZXJhbGx5IHVuZGVyLWF0dHJpYnV0ZWQgX01JTkRfIHRvIF9ib3RoXyBhbmltYXRlcyBhbmQgaW5hbmltYXRlcy4gVGhlc2UgdW5kZXItYXR0cmlidXRpb25zIGJlY2FtZSBsZXNzIGRyYW1hdGljIGJldHdlZW4gNC02eSBhbmQgNy05eSBvZiBhZ2UsIGFuZCBieSA3LTl5IGNoaWxkcmVuJ3MgX01JTkRfIGF0dHJpYnV0aW9ucyB0byBpbmFuaW1hdGVzIHdlcmUgYWR1bHQtbGlrZS4gQnV0IGV2ZW4gYXQgNy05eSwgY2hpbGRyZW4gZGlkIG5vdCBhdHRyaWJ1dGVkIGFzIG1hbnkgX01JTkRfIGNhcGFjaXRpZXMgdG8gYW5pbWF0ZXMgYXMgZGlkIGFkdWx0czsgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QsIF9NSU5EXyBhdHRyaWJ1dGlvbnMgaW5jcmVhc2VkIGZvciBhbGwgb2YgdGhlIGFuaW1hdGUgY2hhcmFjdGVycywgYW5kIHBhcnRpY3VsYXJseSBkcmFtYXRpY2FsbHkgZm9yIHRoZSBiaXJkLCB0aGUgbW91c2UsIGFuZCB0aGUgZWxlcGhhbnQgKHNlZSBGaWd1cmUgNiwgUGFuZWwgQiwgYm90dG9tIHJvdykuCgpUaGUgcmF3IGRhdGEgZnVydGhlciBzdXBwb3JzdCB0aGVzZSBvYnNlcnZhdGlvbnM7IHNlZSBGaWd1cmUgNyBmb3IgcmF3IGNvdW50cyBvZiBfbm9fLCBfa2luZGFfLCBhbmQgX3llc18gcmVzcG9uc2VzIGZvciBhbGwgaXRlbXMsIGdyb3VwZWQgYnkgZmFjdG9yLCBhbmltYWN5IHN0YXR1cyAoUGFuZWxzIEEtQykgb3IgY2hhcmFjdGVyIChQYW5lbHMgRC1GKSwgYW5kIGFnZSBncm91cC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHBhaW4gKHRoZSBmaXJzdCBjYXBhY2l0eSB1bmRlciBfQk9EWV8pOiBBY3Jvc3MgYWdlIGdyb3VwcywgbW9zdCBwYXJ0aWNpcGFudHMgc2FpZCB0aGF0IGFuIGVsZXBoYW50IGNvdWxkIGZlZWwgcGFpbiwgd2l0aCB0aGUgcHJvcG9ydGlvbiBvZiAieWVzIiByZXNwb25zZXMgaW5jcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3VwczsgbWVhbndoaWxlLCBmZXcgcGFydGljaXBhbnRzIHNhaWQgdGhhdCBhIGNvbXB1dGVyIGNvdWxkIGZlZWwgcGFpbiwgd2l0aCB0aGUgcHJvcG9ydGlvbiBvZiAieWVzIiByZXNwb25zZXMgZGVjcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3Vwcy4gTW9yZSBkcmFtYXRpYyBjaGFuZ2VzIGFyZSBldmlkZW50IGluIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gZmFjdG9ycywgd2l0aCBhdHRyaWJ1dGlvbnMgb2YgX0hFQVJUXyBnZW5lcmFsbHkgZGVjcmVhc2luZyBhY3Jvc3MgYWdlIGdyb3VwcyAoZXNwZWNpYWxseSB0byBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgLSBlLmcuLCB0aGUgY29tcHV0ZXIsIHRoZSByb2JvdCksIGFuZCBhdHRyaWJ1dGlvbnMgb2YgX01JTkRfIGdlbmVyYWxseSBpbmNyZWFzaW5nIGFjcm9zcyBhZ2UgZ3JvdXBzIChlc3BlY2lhbGx5IHRvIGFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgLSBlLmcuLCB0aGUgbW91c2UsIHRoZSBnb2F0LCB0aGUgZWxlcGhhbnQpLiAoU2VlIFNPTSBmb3IgYW4gYW5hbHlzaXMsIHBhcmFsbGVsIHRvIHRoZSByZWdyZXNzaW9uIGFuYWx5c2VzIGhlcmUsIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3AtbG9hZGluZyBtZW50YWwgY2FwYWNpdGllcyBmb3IgZWFjaCBmYWN0b3IgdGhhdCB3ZXJlIGVuZG9yc2VkIGJ5IHBhcnRpY2lwYW50cyBvZiBkaWZmZXJlbnQgYWdlcy4pCgpgYGB7cn0KZDJfYWxsIDwtIGQyX2FkICU+JQogIGZ1bGxfam9pbihkMl83OSkgJT4lCiAgZnVsbF9qb2luKGQyXzQ2KSAlPiUKICBzZWxlY3QoYWdlX2dyb3VwLCBzdWJpZCwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VfbnVtKSAlPiUKICBsZWZ0X2pvaW4obG9hZGluZ3NfZnVuKGVmYV8zX2QyX2FkKSAlPiUgCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gMToyMCkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIG9yZGVyKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZXNwb25zZV9udW0pKSAlPiUKICBsZWZ0X2pvaW4oZDJfYWxsX2NoYXIgJT4lIHNlbGVjdCgtcHJvcCkpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjUiID0gImtpbmRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiA9ICJ5ZXMiKSwKICAgICAgICAgZmFjdG9yID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjIiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSwKICAgICAgICAgYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW43OSIgPSAiNy05eSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHMiID0gImFkdWx0cyIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBpZmVsc2UoZ3JlcGwoImJlYXIiLCBhcy5jaGFyYWN0ZXIoY2hhcmFjdGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVkZHkgYmVhciIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSwKICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2xsIiwgInRlZGR5IGJlYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVldGxlIiwgImJpcmQiLCAibW91c2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29hdCIsICJlbGVwaGFudCIpKSwKICAgICAgICAgYWdlX2dyb3VwX24gPSBwYXN0ZTAoYWdlX2dyb3VwLCAiXG4obiA9ICIsIG4sICIpIikpCmBgYAoKYGBge3J9CmZpZzA3YV9mdW4gPC0gZnVuY3Rpb24od2hpY2hmYWMpewogIAogIGZpZyA8LSBkMl9hbGwgJT4lCiAgICBmaWx0ZXIoZmFjdG9yID09IHdoaWNoZmFjKSAlPiUKICAgIGxlZnRfam9pbihkMl9hbmltICU+JSBkaXN0aW5jdChjaGFyYWN0ZXIsIGFuaW1faW5hbikpICU+JQogICAgbXV0YXRlKGFuaW1faW5hbiA9IHJlY29kZV9mYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluYW5pbWF0ZSIgPSAiaW5hbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSIgPSAiYW5pbWF0ZXMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNhcGFjaXR5LCBvcmRlciksCiAgICAgICAgICAgICAgIGZpbGwgPSBhbmltX2luYW4sIGFscGhhID0gcmVzcG9uc2UpKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGFuaW1faW5hbiksIHJvd3MgPSB2YXJzKGFnZV9ncm91cCksCiAgICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgICAjIGdlb21fbGFiZWwoZGF0YSA9IGQyX2FuaW0gJT4lCiAgICAjICAgICAgICAgICAgICBsZWZ0X2pvaW4oCiAgICAjICAgICAgICAgICAgICAgIGQyX2FsbF9jaGFyICU+JQogICAgIyAgICAgICAgICAgICAgZGlzdGluY3QoY2hhcmFjdGVyLCBmYWN0b3IsIGFnZV9ncm91cCwgbiksCiAgICAjICAgICAgICAgICAgYWVzKHggPSBOQSwgeSA9IE5BLCBhbHBoYSA9IE5BLCBmaWxsID0gTkEsCiAgICAjICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICMgICAgICAgICAgICB4ID0gMC43NSwgeSA9IDEsIGFscGhhID0gMC44LCBoanVzdCA9IDAsIHZqdXN0ID0gMSwKICAgICMgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLCBzaXplID0gMykgKwogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAwLjUsIDEpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygic2xhdGVncmV5IiwgImZpcmVicmljazEiKSwgbmEudmFsdWUgPSAiZ3JheSIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlZ3JleSIsICJmaXJlYnJpY2sxIiksIG5hLnZhbHVlID0gImdyYXkiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgICBsYWJzKHRpdGxlID0gd2hpY2hmYWMsCiAgICAgICAgIHkgPSAicHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMiLAogICAgICAgICB4ID0gIm1lbnRhbCBjYXBhY2l0eSAoYnkgZmFjdG9yKSIsCiAgICAgICAgIGZpbGwgPSAiYW5pbWFjeSIpICsKICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAxLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSwKICAgICAgICAgICBhbHBoYSA9ICJub25lIikKICAKICBpZih3aGljaGZhYyAhPSAiTUlORCIpewogICAgZmlnIDwtIGZpZyArIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikgKyBsYWJzKHggPSAiIikKICB9CiAgCiAgcmV0dXJuKGZpZykKfQoKZmlnMDdhX0JPRFlfcGxvdCA8LSBmaWcwN2FfZnVuKCJCT0RZIikKZmlnMDdhX0hFQVJUX3Bsb3QgPC0gZmlnMDdhX2Z1bigiSEVBUlQiKQpmaWcwN2FfTUlORF9wbG90IDwtIGZpZzA3YV9mdW4oIk1JTkQiKQoKZmlnMDdhX3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwN2FfQk9EWV9wbG90LCBmaWcwN2FfSEVBUlRfcGxvdCwgZmlnMDdhX01JTkRfcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgbGFiZWxzID0gIkFVVE8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLCAxLCAxLjIpKQpgYGAKCmBgYHtyfQpmaWcwN2JfZnVuIDwtIGZ1bmN0aW9uKHdoaWNoZmFjKXsKICAKICBmaWcgPC0gZDJfYWxsICU+JQogICAgbGVmdF9qb2luKGQyX2FsbF9jaGFyICU+JQogICAgICAgICAgICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGdzdWIoIl8iLCAiICIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSkgJT4lCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjaGFyYWN0ZXIsIGFnZV9ncm91cCwgbikpICU+JQogICAgZmlsdGVyKGZhY3RvciA9PSB3aGljaGZhYykgJT4lCiAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29tcHV0ZXIiLCAicm9ib3QiLCAiZG9sbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlZGR5IGJlYXIiLCAiYmVldGxlIiwgImJpcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSIsICJnb2F0IiwgImVsZXBoYW50IikpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY2FwYWNpdHksIG9yZGVyKSwKICAgICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgYWxwaGEgPSByZXNwb25zZSkpICsKICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoY2hhcmFjdGVyKSwgcm93cyA9IHZhcnMoYWdlX2dyb3VwKSwKICAgICAgICAgICAgICAgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICAgICMgZ2VvbV9sYWJlbChkYXRhID0gZDJfYWxsICU+JQogICAgIyAgICAgICAgICAgICAgbGVmdF9qb2luKAogICAgIyAgICAgICAgICAgICAgICBkMl9hbGxfY2hhciAlPiUKICAgICMgICAgICAgICAgICAgICAgICBtdXRhdGUoY2hhcmFjdGVyID0gZ3N1YigiXyIsICIgIiwgY2hhcmFjdGVyKSwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlciwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbXB1dGVyIiwgInJvYm90IiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvbGwiLCAidGVkZHkgYmVhciIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSIsICJnb2F0IiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZXBoYW50IikpKSkgJT4lCiAgICAjICAgICAgICAgICAgICBkaXN0aW5jdChjaGFyYWN0ZXIsIGZhY3RvciwgYWdlX2dyb3VwLCBuKSwKICAgICMgICAgICAgICAgICBhZXMoeCA9IE5BLCB5ID0gTkEsIGFscGhhID0gTkEsIGZpbGwgPSBOQSwKICAgICMgICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIihuPSIsIG4sICIpIikpLAogICAgIyAgICAgICAgICAgIHggPSAwLjc1LCB5ID0gMSwgYWxwaGEgPSAwLjgsIGhqdXN0ID0gMCwgdmp1c3QgPSAxLAogICAgIyAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsIHNpemUgPSAzKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDAuNSwgMSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICAgIGxhYnModGl0bGUgPSB3aGljaGZhYywKICAgICAgICAgeSA9ICIiLCAKICAgICAgICAgeCA9ICJtZW50YWwgY2FwYWNpdHkgKGJ5IGZhY3RvcikiKSArCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSwgYnlyb3cgPSBULCByZXZlcnNlID0gVCksCiAgICAgICAgICAgYWxwaGEgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEsIGJ5cm93ID0gVCkpCiAgCiAgaWYod2hpY2hmYWMgIT0gIk1JTkQiKXsKICAgIGZpZyA8LSBmaWcgKyBndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsgbGFicyh4ID0gIiIpCiAgfQogIAogIHJldHVybihmaWcpCn0KCmZpZzA3Yl9CT0RZX3Bsb3QgPC0gZmlnMDdiX2Z1bigiQk9EWSIpCmZpZzA3Yl9IRUFSVF9wbG90IDwtIGZpZzA3Yl9mdW4oIkhFQVJUIikKZmlnMDdiX01JTkRfcGxvdCA8LSBmaWcwN2JfZnVuKCJNSU5EIikKCmZpZzA3Yl9wbG90cyA8LSBwbG90X2dyaWQoZmlnMDdiX0JPRFlfcGxvdCwgZmlnMDdiX0hFQVJUX3Bsb3QsIGZpZzA3Yl9NSU5EX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIGxhYmVscyA9IGMoIkQiLCAiRSIsICJGIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEuMikpCmBgYAoKYGBge3J9CmZpZzA3X3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwN2FfcGxvdHMsIGZpZzA3Yl9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygwLjI1LCAxKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxfQpmaWcwN193aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwN19wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA3OiBQcm9wb3J0aW9uIG9mIFN0dWR5IDIgcGFydGljaXBhbnRzIHdobyByZXNwb25kZWQgJ3llcycgKGRhcmspLCAna2luZGEnIChtZWRpdW0pLCBvciAnbm8nIChsaWdodCkgdG8gIGVhY2ggbWVudGFsIGNhcGFjaXR5IGl0ZW0sIGdyb3VwZWQgYnkgdGhlIGZhY3RvciBvbiB3aGljaCB0aGV5IGxvYWRpbmcgbW9zdCBwb3NpdGl2ZWx5IChCT0RZLCBIRUFSVCwgTUlORCkgYWNjb3JkaW5nIHRvIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcy4gRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIG5pbmUgdGFyZ2V0IGNoYXJhY3RlcnMgKDYtMTggcGVyIGNoYXJhY3RlciwgcGVyIGFnZSBncm91cCkuIFdlIHByZXNlbnQgdHdvIHdheXMgb2YgbG9va2luZyBhdCB0aGVzZSBkYXRhOiBjb2xsYXBzaW5nIGNoYXJhY3RlcnMgaW50byBhbmltYXRlcyAoYmVldGxlLCBiaXJkLCBtb3VzZSwgZ29hdCwgZWxlcGhhbnQpIHZzLiBpbmFuaW1hdGVzIChjb21wdXRlciwgcm9ib3QsIGRvbGwsIHRlZGR5IGJlYXI7IFBhbmVscyBBLUMpOyBhbmQgZXhhbWluaW5nIGVhY2ggY2hhcmFjdGVyIGluZGl2aWR1YWxseSAoUGFuZWwgRC1GKS4gUmVzcG9uc2VzIGFyZSBzaG93biBzZXBhcmF0ZWx5IGJ5IGFnZSBncm91cCAoNC02eSwgNy05eSwgYWR1bHRzKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnMDdfd2l0aF9jYXB0aW9uKQpgYGAKCmBgYHtyfQpkMl9hbGxfYnVja2V0cyA8LSBkMl9hbGwgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIikgJT4lCiAgZGlzdGluY3QoZmFjdG9yLCBjYXBhY2l0eSwgb3JkZXIpICU+JQogIGdyb3VwX2J5KGZhY3RvcikgJT4lCiAgdG9wX24oLTYsIG9yZGVyKSAlPiUKICBhcnJhbmdlKGZhY3Rvciwgb3JkZXIpCgpkMl9hbGxfZW5kb3JzZSA8LSBkMl9hbGwgJT4lCiAgbGVmdF9qb2luKGQyX2FuaW0gJT4lIGRpc3RpbmN0KGNoYXJhY3RlciwgYW5pbV9pbmFuKSkgJT4lCiAgZmlsdGVyKGNhcGFjaXR5ICVpbiUgZDJfYWxsX2J1Y2tldHMkY2FwYWNpdHkpICU+JQogIG11dGF0ZShlbmRvcnNlID0gaWZlbHNlKHJlc3BvbnNlX251bSA+IDAsIDEsIDApLAogICAgICAgICBhbmltX2luYW4gPSByZWNvZGVfZmFjdG9yKGFuaW1faW5hbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5hbmltYXRlIiA9ICJpbmFuaW1hdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSIgPSAiYW5pbWF0ZXMiKSkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBzdWJpZCwgYW5pbV9pbmFuLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgc3VtbWFyaXNlKHByb3BfZW5kb3JzZSA9IG1lYW4oZW5kb3JzZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbiA9IGxlbmd0aChlbmRvcnNlKSkgJT4lCiAgdW5ncm91cCgpCgpkMl9hbGxfZW5kb3JzZV9ib290IDwtIGQyX2FsbF9lbmRvcnNlICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInByb3BfZW5kb3JzZSIpICU+JQogIHVuZ3JvdXAoKQoKZDJfYWxsX2VuZG9yc2VfYW5pbV9ib290IDwtIGQyX2FsbF9lbmRvcnNlICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgYW5pbV9pbmFuLCBmYWN0b3IpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInByb3BfZW5kb3JzZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpmaWdTVVBQM2FfcGxvdCA8LSBkMl9hbGxfZW5kb3JzZV9hbmltX2Jvb3QgJT4lCiAgZmlsdGVyKCFpcy5uYShhbmltX2luYW4pKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjc5IiA9ICI3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSwKICAgICAgICAgYW5pbV9pbmFuID0gcmVjb2RlX2ZhY3RvcihhbmltX2luYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluYW5pbWF0ZSIgPSAiaW5hbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiID0gImFuaW1hdGVzIiksCiAgICAgICAgIGZhY2V0X2xhYiA9ICJhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZV9ncm91cCwgZ3JvdXAgPSBhbmltX2luYW4sCiAgICAgICAgICAgICB5ID0gbWVhbiwgY29sb3IgPSBhbmltX2luYW4pKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZmFjdG9yKSwgY29scyA9IHZhcnMoZmFjZXRfbGFiKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlZ3JleSIsICJmaXJlYnJpY2sxIiksIG5hLnZhbHVlID0gImdyYXkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAyLzYpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDAsIDYsIDIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCByZXZlcnNlID0gVCkpICsKICBsYWJzKHggPSAiYWdlIGdyb3VwIiwgeSA9ICJudW1iZXIgb2YgaXRlbXMgZW5kb3JzZWQiLCBjb2xvciA9ICJhbmltYWN5IikKYGBgCgpgYGB7cn0KZmlnU1VQUDNiX3Bsb3QgPC0gZ2dwbG90KGQyX2FsbF9lbmRvcnNlX2Jvb3QgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkMl9hbGxfY2hhciAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGdzdWIoIl8iLCAiICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcikpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjc5IiA9ICI3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb21wdXRlciIsICJyb2JvdCIsICJkb2xsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVkZHkgYmVhciIsICJiZWV0bGUiLCAiYmlyZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIiwgImdvYXQiLCAiZWxlcGhhbnQiKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBtZWFuLCBjb2xvciA9IGNoYXJhY3RlcikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3RvciksIGNvbHMgPSB2YXJzKGNoYXJhY3RlciksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjaGFyYWN0ZXIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAgICAgICAgICAgICAgICAgIyBmYXR0ZW4gPSAzLCBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIpICsKICAjIGdlb21fbGFiZWwoYWVzKGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpLCB5ID0gY2lfbG93ZXIpLAogICMgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwgYWxwaGEgPSAwLjgsCiAgIyAgICAgICAgICAgIG51ZGdlX3kgPSAtMC4xLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAyLzYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMCwgNiwgMikpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpKSArCiAgbGFicyh4ID0gImFnZSBncm91cCIsIHkgPSAiIiwgY29sb3IgPSAiY2hhcmFjdGVyIikKYGBgCgpgYGB7cn0KZmlnU1VQUDNfcGxvdHMgPC0gcGxvdF9ncmlkKGZpZ1NVUFAzYV9wbG90LCBmaWdTVVBQM2JfcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygwLjE1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC41fQpmaWdTVVBQM193aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWdTVVBQM19wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSBTVVBQMzogTnVtYmVyIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyAob3V0IG9mIDYpIGVuZG9yc2VkIGluIGVhY2ggZG9tYWluIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGJ5IDQtIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiBTdHVkeSAyLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDIwIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBvbmUgb2YgbmluZSB0YXJnZXQgY2hhcmFjdGVycy4gV2UgZGVmaW5lZCBlYWNoIGRvbWFpbiBieSB0aGUgNiBpdGVtcyB0aGF0IGxvYWRlZCB0aGUgbW9zdCBwb3NpdGl2ZWx5IG9uIHRoZSBjb3JyZXNwb25kaW5nIGZhY3RvciBpbiBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMsIGFuZCB3ZSBjb25zaWRlcmVkIHJlc3BvbnNlcyBvZiBlaXRoZXIgJ3llcycgb3IgJ2tpbmRhJyAoYnV0IG5vdCAnbm8nKSB0byBiZSBlbmRvcnNlbWVudHMuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIiwgMTgxKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZ1NVUFAzX3dpdGhfY2FwdGlvbikKYGBgCgpgYGB7cn0KZmlnU1VQUDRhX3Bsb3QgPC0gZDJfYWxsX2VuZG9yc2UgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCAhPSAiYWR1bHRzIikgJT4lCiAgbGVmdF9qb2luKGZ1bGxfam9pbihkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSksCiAgICAgICAgICAgICAgICAgICAgICBkMl80NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogIG11dGF0ZShmYWNldF9sYWIgPSAiYW5pbWF0ZXMgdnMuIGluYW5pbWF0ZXMiLAogICAgICAgICBhbmltX2luYW4gPSBjYXNlX3doZW4oZ3JlcGwoImluYW4iLCBhbmltX2luYW4pIH4gImluYW5pbWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFuaW0iLCBhbmltX2luYW4pIH4gImFuaW1hdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgYW5pbV9pbmFuID0gZmFjdG9yKGFuaW1faW5hbiwgbGV2ZWxzID0gYygiaW5hbmltYXRlcyIsICJhbmltYXRlcyIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gcHJvcF9lbmRvcnNlLCAKICAgICAgICAgICAgIGZpbGwgPSBhbmltX2luYW4sIGNvbG9yID0gYW5pbV9pbmFuKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZmFjZXRfbGFiKSwgcm93cyA9IHZhcnMoZmFjdG9yKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC40LCB3aWR0aCA9IDAsIGhlaWdodCA9IDAuMDMpICsKICBiaW5vbWlhbF9zbW9vdGgoYWVzKHdlaWdodCA9IG4pLCBhbHBoYSA9IDAuMTAsIHNob3cubGVnZW5kID0gRikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsCiAgIyAgICAgICAgICAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkMl9hbGxfZW5kb3JzZSAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpICU+JQogICAgICAgICAgICAgICBtdXRhdGUoYW5pbV9pbmFuID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgIGdyZXBsKCJpbmFuIiwgYW5pbV9pbmFuKSB+ICJpbmFuaW1hdGVzIiwKICAgICAgICAgICAgICAgICBncmVwbCgiYW5pbSIsIGFuaW1faW5hbikgfiAiYW5pbWF0ZXMiLAogICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgICAgICAgICBhbmltX2luYW4gPSBmYWN0b3IoYW5pbV9pbmFuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiaW5hbmltYXRlcyIsICJhbmltYXRlcyIpKSksCiAgICAgICAgICAgICBhZXMoeCA9IDExKSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMC4wMykpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGQyX2FsbF9lbmRvcnNlX2FuaW1fYm9vdCAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIikgJT4lCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGFuaW1faW5hbiA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJpbmFuIiwgYW5pbV9pbmFuKSB+ICJpbmFuaW1hdGVzIiwKICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhbmltIiwgYW5pbV9pbmFuKSB+ICJhbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgICAgICAgICAgICAgICBhbmltX2luYW4gPSBmYWN0b3IoYW5pbV9pbmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImluYW5pbWF0ZXMiLCAiYW5pbWF0ZXMiKSkpLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IDExLCB5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSksIAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsgIywgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSA0LCBzaGFwZSA9IDIxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoNDoxMSksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg0OjEwLCAieSIpLCAiYWR1bHRzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDEvNiksIGxhYmVscyA9IDA6NikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJzbGF0ZWdyZXkiLCAiZmlyZWJyaWNrMSIpLCBuYS52YWx1ZSA9ICJncmF5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlZ3JleSIsICJmaXJlYnJpY2sxIiksIG5hLnZhbHVlID0gImdyYXkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeSA9ICJudW1iZXIgb2YgY2FwYWNpdGllcyBlbmRvcnNlZCIsIAogICAgICAgY29sb3IgPSAiYW5pbWFjeSIsIGZpbGwgPSAiYW5pbWFjeSIpCmBgYAoKYGBge3J9CmZpZ1NVUFA0Yl9wbG90IDwtIGQyX2FsbF9lbmRvcnNlICU+JQogIGZpbHRlcihhZ2VfZ3JvdXAgIT0gImFkdWx0cyIpICU+JQogIGxlZnRfam9pbihmdWxsX2pvaW4oZDJfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpLAogICAgICAgICAgICAgICAgICAgICAgZDJfNDYgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2UpKSAlPiUKICBtdXRhdGUoZmFjZXRfbGFiID0gImluZGl2aWR1YWwgY2hhcmFjYXRlcnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBwcm9wX2VuZG9yc2UsIAogICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgY29sb3IgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhmYWNldF9sYWIpLCByb3dzID0gdmFycyhmYWN0b3IpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjQsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMC4wMykgKwogIGJpbm9taWFsX3Ntb290aChhZXMod2VpZ2h0ID0gbiksIGFscGhhID0gMC4xMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwKICAjICAgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGQyX2FsbF9lbmRvcnNlICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTIpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkMl9hbGxfZW5kb3JzZV9ib290ICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMiwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMS41LCBzaGFwZSA9IDIxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoNDoxMCwgMTIpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhwYXN0ZTAoNDoxMCwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAxLzYpLCBsYWJlbHMgPSAwOjYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBUKSkgKwogIGxhYnMoeSA9ICIiKQpgYGAKCmBgYHtyfQpmaWdTVVBQNF9wbG90cyA8LSBwbG90X2dyaWQoZmlnU1VQUDRhX3Bsb3QsIGZpZ1NVUFA0Yl9wbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDAuODUsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDF9CmZpZ1NVUFA0X3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZ1NVUFA0X3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIFNVUFA0OiBOdW1iZXIgb2YgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIChvdXQgb2YgNikgZW5kb3JzZWQgaW4gZWFjaCBkb21haW4gKEJPRFksIEhFQVJULCBhbmQgTUlORCkgYnkgNC0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBhbmQgYWR1bHRzIGluIFN0dWR5IDIsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMjAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiBuaW5lIHRhcmdldCBjaGFyYWN0ZXJzLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gTGluZXMgY29ycmVzcG9uZCB0byBsb2dpc3RpYyByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4iLCAxNTMpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnU1VQUDRfd2l0aF9jYXB0aW9uKQpgYGAKCiMjIyMgQWdlIGRpZmZlcmVuY2VzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlcwoKQXMgaW4gU3R1ZHkgMSwgd2Ugd2VyZSBpbnRlcmVzdGVkIG5vdCBvbmx5IGluIGRpZmZlcmVuY2VzIGFjcm9zcyBhZ2UgZ3JvdXBzLCBidXQgYWxzbyBhY3Jvc3MgdGhl4oCUZXZlbiB3aWRlcuKAlGFnZSByYW5nZSB3aXRoaW4gb3VyIGNoaWxkIHNhbXBsZXMuIEluIFN0dWR5IDIsIHRoaXMgaW5jbHVkZWQgY2hpbGRyZW4gYXMgeW91bmcgYXMgNCB5ZWFycyB1cCB0byBuZWFybHkgMTAgeWVhcnMgb2YgYWdlLiBUaGlzIGFsbG93ZWQgdXMgdG8gbG9vayBhdCBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBpbiBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGFjcm9zcyBhIHdpZGUgcGVyaW9kIGZyb20gZWFybHkgdG8gbWlkZGxlIGNoaWxkaG9vZC4KCmBgYHtyfQojIGQyXzQ5X2FuaW1fciA8LSBicm0oc2NvcmUgfiBmYWN0b3JfbmFtZSAqIGFuaW1faW5hbiAqIGFnZSArCiMgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3ViaWQpICsKIyAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBmYWN0b3JfbmFtZSB8IGNoYXJhY3RlciksCiMgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZDJfYW5pbSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCAhPSAiYWR1bHRzIiwgIWlzLm5hKGFnZSkpICU+JQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwKIyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSksCiMgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQpCiMgc2F2ZVJEUyhkMl80OV9hbmltX3IsIGZpbGUgPSAiLi9icm1zX21vZGVscy9kMl80OV9hbmltX3IucmRzIikKCmQyXzQ5X2FuaW1fciA8LSByZWFkUkRTKCIuL2JybXNfbW9kZWxzL2QyXzQ5X2FuaW1fci5yZHMiKQojIHN1bW1hcnkoZDJfNDlfYW5pbV9yKQpgYGAKCmBgYHtyfQpkMl9jaF9hZ2UgPC0gZnVsbF9qb2luKGQyXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICBkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpCmBgYAoKVG8gZXhwbG9yZSBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBjb250aW51b3VzbHkgd2l0aGluIHRoZSBjaGlsZCBzYW1wbGVzLCB3ZSBjb25kdWN0ZWQgYW4gYWRkaXRpb25hbCByZWdyZXNzaW9uIGFuYWx5c2lzIG9uIGNoaWxkcmVuJ3MgZmFjdG9yIHNjb3JlcyBhbG9uZSwgaW5jbHVkaW5nIGludGVyYWN0aW9ucyB3aXRoIGV4YWN0IGFnZSBpbiB5ZWFycyAoY2VudGVyZWQgYXQgdGhlIG1lYW46IGByIGZvcm1hdChyb3VuZChtZWFuKGQyX2NoX2FnZSRhZ2UsIG5hLnJtID0gVCksIDIpLCBuc21hbGwgPSAyKWB5KSByYXRoZXIgdGhhbiBhZ2UgZ3JvdXAuIFNlZSBUYWJsZSA0IGZvciB0aGUgZnVsbCByZXN1bHRzIG9mIHRoaXMgbW9kZWwsIGFuZCBGaWd1cmUgOCBmb3IgYSB2aXN1YWxpemF0aW9uIG9mIGNoYW5nZXMgaW4gY2hpbGRyZW4ncyBmYWN0b3Igc2NvcmVzIGFjcm9zcyB0aGUgYWdlIHJhbmdlLgoKVGhpcyBhbmFseXNpcyBjb25maXJtZWQgdGhhdCwgcmVsYXRpdmUgdG8gdGhlIGdyYW5kIG1lYW4sIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIGRlY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl80OV9hbmltX3IsICJmYWN0b3JfbmFtZUhfR006YWdlIilgKSBhbmQgYXR0cmlidXRpb25zIG9mIF9NSU5EXyBpbmNyZWFzZWQgd2l0aCBhZ2UgKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFnZSIpYCkuIFRoZXNlIGZpbmRpbmdzIGFyZSBib3RoIGluIGxpbmUgd2l0aCB0aGUgYWdlIGdyb3VwIGFuYWx5c2lzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgc3VnZ2VzdGluZyB0aGF0IHRoZSBvYnNlcnZlZCBncm91cCBkaWZmZXJlbmNlcyBjb3JyZXNwb25kIHRvIGdyYWR1YWwgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcyBhcyBjaGlsZHJlbidzIHJlc3BvbnNlcyBiZWNvbWUgaW5jcmVhc2luZ2x5IGFkdWx0LWxpa2UuIAoKSWYgY2hpbGRyZW4gd2VyZSBhbHNvIGJlY29taW5nIGluY3JlYXNpbmdseSBhZHVsdC1saWtlIGluIHRoZWlyIGRpc3RpbmN0aW9ucyBiZXR3ZWVuIGFuaW1hdGUgYW5kIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycywgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2Ygb3VyIGFnZSBncm91cCBhbmFseXNpcyAocHJldmlvdXMgc2VjdGlvbikgd2Ugd291bGQgYWxzbyBleHBlY3QgdGhlIG92ZXJhbGwgYW5pbWF0ZS1pbmFuaW1hdGUgZGlzdGluY3Rpb24gdG8gaW5jcmVhc2Ugd2l0aCBhZ2UsIGRyaXZlbiBwcmltYXJpbHkgYnkgaW5jcmVhc2VzIGluIHRoZSBfQk9EWV8gYW5kIGVzcGVjaWFsbHkgX01JTkRfIGRvbWFpbnMgKHNlZSBGaWd1cmUgNiwgUGFuZWwgQSkuIEluc3RlYWQsIGNvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMsIHRoZSBnZW5lcmFsIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZXMgYW5kIGluYW5pbWF0ZXMgZGlkIF9ub3RfIGRpZmZlciB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihkMl80OV9hbmltX3IsICJhbmltX2luYW5hbmltX0dNOmFnZSIpYCk7IF9kZWNyZWFzZWRfIGluIHRoZSBfSEVBUlRfIGRvbWFpbiwgcmVsYXRpdmUgdG8gdGhlIGdyYW5kIG1lYW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR006YWdlIilgKTsgYW5kIGRpZCBub3QgY2hhbmdlIHN1YnN0YW50aWFsbHkgaW4gdGhlIF9NSU5EXyBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZDJfNDlfYW5pbV9yLCAiZmFjdG9yX25hbWVNX0dNOmFuaW1faW5hbmFuaW1fR006YWdlIilgKS4gCgpXZSBub3RlIHRoYXQgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3Qgc2VlbWVkIHRvIGJlY29tZSBwYXJ0aWN1bGFybHkgdW4tYWR1bHQtbGlrZSBhdCBvbGRlciBhZ2VzIChzZWUgRmlndXJlIDgsIFBhbmVsIEIsIGluIGJsdWUpLiBFeGNsdWRpbmcgdGhlc2UgcGFydGljaXBhbnRzIHlpZWxkcyBhIG1vcmUgY29oZXJlbnQgcGljdHVyZSBvZiBpbmNyZWFzaW5nIGFkdWx0LWxpa2UtbmVzcyB3aXRoIGluY3JlYXNpbmcgYWdlIChGaWd1cmUgOCwgUGFuZWwgQSwgaW4gdHVycXVvaXNlKS4gVGhpcyBkaWQgbm90IGFwcGVhciB0byBiZSB0aGUgY2FzZSB3aGVuIGV4Y2x1ZGluZyBhbnkgb2YgdGhlIG90aGVyIGluYW5pbWF0ZSB0YXJnZXQgY2hhcmFjdGVycy4gV2UgZWxhYm9yYXRlIG9uIGNoaWxkcmVuJ3MgY29uY2VwdHVhbGl6YXRpb25zIG9mIHRoZSBtZW50YWwgbGl2ZXMgb2Ygcm9ib3RzIGluIHBhcnRpY3VsYXIgaW4gdGhlIEdlbmVyYWwgRGlzY3Vzc2lvbiAoc2VlIGFsc28gV2Vpc21hbiwgdW5kZXIgcmV2aWV3KS4gKFNlZSBhbHNvIFNPTSBmb3IgYW4gYW5hbHlzaXMgb2YgaG93IGV4Y2x1ZGluZyBhbnkgaW5kaXZpZHVhbCB0YXJnZXQgY2hhcmFjdGVyLCBvciBhbnkgaW5kaXZpZHVhbCBtZW50YWwgY2FwYWNpdHksIGFmZmVjdHMgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlcyByZXZlYWxlZCBieSBmYWN0b3IgYW5hbHlzaXMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGFnZSBncm91cHMgaW4gU3R1ZHkgMi4pCgpgYGB7ciwgaW5jbHVkZSA9IFQsIHJlc3VsdHMgPSAiYXNpcyJ9CmZpeGVmKGQyXzQ5X2FuaW1fcikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoCiAgICBQYXJhbWV0ZXIsCiAgICAjIE9WRVJBTEwKICAgICJJbnRlcmNlcHQiID0gIihJbnRlcmNlcHQpIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJhbmltX2luYW5hbmltX0dNIiA9ICJjaGFyYWN0ZXJzOiBhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFuaW1faW5hbmFuaW1fR00iID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgTUlORCIsCiAgICAjIEJZIEFHRQogICAgImFnZSIgPSAiYWdlIChjZW50ZXJlZCBhdCB0aGUgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2UiID0gIkhFQVJUIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZSIgPSAiTUlORCDDlyBhZ2UiLAogICAgImFuaW1faW5hbmFuaW1fR006YWdlIiA9ICJjaGFyYWN0ZXJzIChhbmltYXRlcy9pbmFuaW1hdGVzKSDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphbmltX2luYW5hbmltX0dNOmFnZSIgPSAiY2hhcmFjdGVycyAoYW5pbWF0ZXMvaW5hbmltYXRlcykgw5cgSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YW5pbV9pbmFuYW5pbV9HTTphZ2UiID0gImNoYXJhY3RlcnMgKGFuaW1hdGVzL2luYW5pbWF0ZXMpIMOXIE1JTkQgw5cgYWdlIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBFcnJvciA9IEVzdC5FcnJvciwgIiAiID0gWCkgJT4lCiAgdW5pdGUoYDk1JSBDSWAsIFEyLjUsIFE5Ny41LCBzZXAgPSAiLCAiKSAlPiUKICBtdXRhdGUoYDk1JSBDSWAgPSBwYXN0ZTAoIlsiLCBgOTUlIENJYCwgIl0iKSkgJT4lCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgMykpLAogICAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQ6IEZpeGVkIGVmZmVjdHMgZnJvbSBhIG1peGVkLWVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBtb2RlbCBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcywgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDIgYnkgYW5pbWFjeSBzdGF0dXMgKGFuaW1hdGVzLCBpbmFuaW1hdGVzKSwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBleGFjdCBhZ2UuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgKiBhbmltYWN5ICsgKDEgfCBzdWJqZWN0KScgYW5kIHdhcyBpbXBsZW1lbnRlZCBpbiB0aGUgJ2JybXMnIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gRmFjdG9yIGFuZCBhbmltYWN5IHdlcmUgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIHdhcyBtZWFuLWNlbnRlcmVkLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkNvbGxhcHNpbmcgYWNyb3NzIGFnZSIsIDEsIDYpICU+JQogIGdyb3VwX3Jvd3MoIkFnZSBlZmZlY3RzIiwgNywgMTIpCmBgYAoKYGBge3J9CmZpZzA4YV9wbG90IDwtIGdncGxvdChkMl9hbmltICU+JSAKICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZmFjZXRfbGFiID0gImFuaW1hdGVzIHZzLiBpbmFuaW1hdGVzIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfam9pbihkYXRhLmZyYW1lKGZhY2V0X2xhYiA9ICJhbmltYXRlcyB2cy4gaW5hbmltYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1faW5hbiA9ICJkdW1teSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lID0gIkJPRFkiKSksCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYW5pbV9pbmFuLCBjb2xvciA9IGFuaW1faW5hbiwgZ3JvdXAgPSBhbmltX2luYW4pKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhmYWN0b3JfbmFtZSksIGNvbHMgPSB2YXJzKGZhY2V0X2xhYiksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjEwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkMl9hbmltICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTEpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkMl9hbmltICU+JSAKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShhZ2VfZ3JvdXAsIGZhY3Rvcl9uYW1lLCBhbmltX2luYW4pICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lIAogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMSwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNob3cubGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICMgZmF0dGVuID0gMS41LCAKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgY29sb3IgPSAiYmxhY2siKSArCiAgIyBFWENMVURFIFJPQk9UCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZ1bmN0aW9uKHgpe3ggJT4lIAogICAgICBmaWx0ZXIoY2hhcmFjdGVyICE9ICJyb2JvdCIsIGFuaW1faW5hbiA9PSAiaW5hbmltYXRlIikgJT4lCiAgICAgIG11dGF0ZShhbmltX2luYW4gPSAiaW5hbl9ub3JvYm90Iil9LAogICAgICBhZXMoY29sb3IgPSBhbmltX2luYW4pLAogICAgICBtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuMTAsIHNob3cubGVnZW5kID0gRiwgbHR5ID0gMSwgc2l6ZSA9IDAuNCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciAhPSAicm9ib3QiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfYW5pbSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoY2hhcmFjdGVyLCBhbmltX2luYW4pKSAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShmYWN0b3JfbmFtZSwgYW5pbV9pbmFuKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5pbV9pbmFuID09ICJpbmFuaW1hdGUiKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYW5pbV9pbmFuID0gImluYW5fbm9yb2JvdCIpLAogICAgICAgICAgICAgICAgICBhZXMoY29sb3IgPSBhbmltX2luYW4sCiAgICAgICAgICAgICAgICAgICAgICB4ID0gMTEgKyAoLjI1LzIgKyAuMjUpLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDMsCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMTgpICsKICAjIHJlc3VtZQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ6MTEpLCBtaW5vcl9icmVha3MgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg0OjEwLCAieSIpLCAiYWR1bHRzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpLCBtaW5vcl9icmVha3MgPSBOVUxMKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImZpcmVicmljazEiLCAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFya3R1cnF1b2lzZSIsICJzbGF0ZWdyZXkiKSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoImFuaW1hdGUiLCAiZHVtbXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5hbmltYXRlIiwgImluYW5faW50cm9kdWN0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFuaW1hdGVzIiwgIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5hbmltYXRlcyIsICIobm8gcm9ib3QpIiksCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZmlyZWJyaWNrMSIsICJ3aGl0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXJrdHVycXVvaXNlIiwgInNsYXRlZ3JleSIpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJhbmltYXRlIiwgImR1bW15IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluYW5pbWF0ZSIsICJpbmFuX25vcm9ib3QiKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYW5pbWF0ZXMiLCAiICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmFuaW1hdGVzIiwgIihubyByb2JvdCkiKSwKICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLCBieXJvdyA9IFQsIHJldmVyc2UgPSBGKSwKICAgICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChucm93ID0gMiwgYnlyb3cgPSBULCByZXZlcnNlID0gRikpICsKICBsYWJzKHggPSAiYWdlIiwgeSA9ICJmYWN0b3Igc2NvcmUiLCAKICAgICAgIGNvbG9yID0gImFuaW1hY3kiLCBmaWxsID0gImFuaW1hY3kiKQpgYGAKCmBgYHtyfQpmaWcwOGJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2QyX2FsbCAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShhZ2UpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGZhY2V0X2xhYiA9ICJpbmRpdmlkdWFsIGNoYXJhY3RlcnMiKSwKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgY29sb3IgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhjaGFyYWN0ZXIpLCByb3dzID0gdmFycyhmYWN0b3JfbmFtZSksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjIwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBlZmFfM19zY29yZXNfZDJfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTEpLCBhbHBoYSA9IDAuNSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZWZhXzNfc2NvcmVzX2Jvb3RfZDJfYWxsICU+JSAKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSAxMSwgeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgICAjIGZhdHRlbiA9IDEuNSwgCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjEsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ6MTEpLCBtaW5vcl9icmVha3MgPSBOVUxMLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhwYXN0ZTAoNDoxMCwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEwLCAxKSwgbWlub3JfYnJlYWtzID0gTlVMTCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwgYnlyb3cgPSBULCByZXZlcnNlID0gVCksCiAgICAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IFQpKSArCiAgbGFicyh5ID0gIiIpCmBgYAoKYGBge3J9CmZpZzA4X3Bsb3RzIDwtIHBsb3RfZ3JpZChmaWcwOGFfcGxvdCwgZmlnMDhiX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwgcmVsX3dpZHRocyA9IGMoMC4xNSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSAxMCwgZmlnLmFzcCA9IDAuNH0KZmlnMDhfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDhfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgODogRmFjdG9yIHNjb3JlcyBmb3IgYWR1bHRzIGFuZCA0LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDEsIHJlcGxvdHRlZCB0byBpbGx1c3RyYXRlIGFnZSBlZmZlY3RzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlcy4gV2UgcHJlc2VudCB0d28gd2F5cyBvZiBsb29raW5nIGF0IHRoZXNlIGRhdGE6IGNvbGxhcHNpbmcgY2hhcmFjdGVycyBpbnRvIGFuaW1hdGVzIChiZWV0bGUsIGJpcmQsIG1vdXNlLCBnb2F0LCBlbGVwaGFudCkgdnMuIGluYW5pbWF0ZXMgKGNvbXB1dGVyLCByb2JvdCwgZG9sbCwgdGVkZHkgYmVhcjsgUGFuZWwgQSk7IGFuZCBleGFtaW5pbmcgZWFjaCBjaGFyYWN0ZXIgaW5kaXZpZHVhbGx5IChQYW5lbCBCKS4gSW4gUGFuZWwgQSwgd2UgYWRkaXRpb25hbGx5IHBsb3QgKGluIHR1cnF1b2lzZSkgYWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiBhdHRyaWJ1dGlvbnMgdG8gaW5hbmltYXRlcyBhZnRlciBleGNsdWRpbmcgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3QuIExpbmVzIGNvcnJlc3BvbmQgdG8gbGluZWFyIHJlZ3Jlc3Npb25zIGNvbnNpZGVyaW5nIGNoaWxkcmVuJ3Mgc2NvcmVzIGFsb25lLiBFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9uIGFkdWx0cycgc2NvcmVzLiBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHRoZSB5LWF4aXMgZGlmZmVycyBhY3Jvc3MgcGFuZWxzLiIsIDIzNSksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwOF93aXRoX2NhcHRpb24pCmBgYAoKIyMgRGlzY3Vzc2lvbgoKV2UgaGFkIHRocmVlIGdvYWxzIGluIFN0dWR5IDI6ICgxKSBUbyB0ZXN0IHdoZXRoZXIgdGhlIGFkdWx0LWxpa2UgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgcmV2ZWFsZWQgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxIHdvdWxkIGhvbGQgdW5kZXIgdGhlIHJhbmdlIG9mIGNvbmRpdGlvbnMgdGhhdCBlbGljaXQgdGhpcyBzdHJ1Y3R1cmUgYW1vbmcgVVMgYWR1bHRzIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHByZXZpb3VzIHdvcms7ICgyKSBUbyBleHBsb3JlIGNvbmNlcHR1YWwgc3RydWN0dXJlIGF0IGFuIGVhcmxpZXIgcG9pbnQgaW4gZGV2ZWxvcG1lbnQgKDQtNnkpOyBhbmQgKDMpIFRvIGV4cGxvcmUgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZXMgaW4gdGhlIF9hcHBsaWNhdGlvbl8gb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYnkgZXhhbWluaW5nIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzIHBhcnRpY2lwYW50cyBvZiBkaWZmZXJlbnQgYWdlcyB0ZW5kZWQgdG8gYXR0cmlidXRlIHRvIHRoZSBuaW5lIHRhcmdldCBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkuCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmUgaXMgcm9idXN0IGFtb25nIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4KClJlZ2FyZGluZyBvdXIgZmlyc3QgZ29hbCwgU3R1ZHkgMiBzdWdnZXN0cyB0aGF0IHRoZSB0aHJlZS1wYXJ0IGNvbmNlcHR1YWwgc3RydWN0dXJl4oCUYW5jaG9yZWQgYnkgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRf4oCUaXMgcmVsaWFibGUgYW5kIHJvYnVzdCBhbW9uZyA3LSB0byA5LXllYXItb2xkIFVTIGNoaWxkcmVuLiBBcyBpbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCB3b3JrIHdpdGggYWR1bHRzLCB0aGUgY2FwYWNpdGllcyB0aGF0ICJoYW5nIHRvZ2V0aGVyIiBpbiBvbGRlciBjaGlsZHJlbidzIHJlYXNvbmluZyB3aGVuIHRhcmdldCBjaGFyYWNhdGVycyBhcmUgcGVyY2VpdmVkIHRvIHZhcnkgaW4gbWVudGFsIGNhcGFjaXR5IHByb2ZpbGVzIGFwcGVhciB0byBiZSBoaWdobHkgc2ltaWxpYXIgdG8gdGhvc2UgdGhhdCAiaGFuZyB0b2dldGhlciIgd2hlbiBwYXJ0aWNpcGFudHMgZGlzYWdyZWUgYWJvdXQgdGhlIG1lbnRhbCBsaXZlcyBvZiBjb250cm92ZXJzaWFsICJlZGdlIGNhc2VzIiBpbiBzb2NpYWwgcmVhc29uaW5nIChTdHVkeSAxKS4KCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZSBjaGFuZ2VzIGJldHdlZW4gNC02eSBhbmQgNy05eQoKUmVnYXJkaW5nIG91ciBzZWNvbmQgZ29hbCwgU3R1ZHkgMiBzdWdnZXN0cyB0aGF0IHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJnb2VzIHN1YnN0YW50aWFsIGNoYW5nZXMgYmV0d2VlbiBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZC4gTGlrZSBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVu4oCZcyByZXNwb25zZXMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IHN0cm9uZyBjb3JyZWxhdGlvbnMgYW1vbmcgYSBzdWl0ZSBvZiBwZXJjZXB0dWFsIGFuZCBjb2duaXRpdmUgY2FwYWNpdGllcyB0aGF0IHdlIGhhdmUgbGFiZWxlZCBfTUlORF8uIFRoaXMgaGlnaGxpZ2h0cyBvbmUgYXNwZWN0IG9mIGNvbmNlcHR1YWwgc3RydWN0dXJlIHRoYXQgc2VlbXMgdG8gYmUgcmVsYXRpdmVseSBzdGFibGUgZnJvbSBlYXJseSBjaGlsZGhvb2Qgb253YXJkLiAKCkhvd2V2ZXIsIGluIGNvbnRyYXN0IHRvIHRoZSBjbGVhciBkaXN0aW5jdGlvbiBiZXR3ZWVuIHBoeXNpb2xvZ2ljYWwgYWJpbGl0aWVzIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0aGF0IGNoYXJhY3Rlcml6ZWQgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCB5b3VuZ2VyIGNoaWxkcmVu4oCZcyByZXNwb25zZXMgc3VnZ2VzdCB0aGF0IHRoZXkgcGVyY2VpdmVkIHBoeXNpb2xvZ2ljYWwgYW5kIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHRvIGJlIG1vcmUgY2xvc2VseSBpbnRlZ3JhdGVkIGFuZCB0aGUgbGluZSBiZXR3ZWVuIHRoZW0gdG8gYmUgbW9yZSBibHVycmVkLgoKYGBge3J9CmVmYV8yX2QyXzQ2X2hpZ2hsb2FkIDwtIGxvYWRpbmdzX2Z1bihlZmFfMl9kMl80NiwgImxvbmciKSAlPiUgCiAgZmlsdGVyKGxvYWRpbmcgPj0gMC42MCkgJT4lCiAgYXJyYW5nZShmYWN0b3IsIGRlc2MobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICBtdXRhdGUoYWR1bHRfZmFjdG9yID0gY2FzZV93aGVuKAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMSIsICJwb3MiKSkgPT0gVCB+ICJCT0RZIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjIiLCAicG9zIikpID09IFQgfiAiSEVBUlQiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMyIsICJwb3MiKSkgPT0gVCB+ICJNSU5EIiwKICAgIFRSVUUgfiAibm8gZG9taW5hbnQgZmFjdG9yIikpICU+JQogIHVuZ3JvdXAoKQpgYGAKCk9uZSBpbmRpY2F0aW9uIG9mIHRoaXMgYmx1cnJpbmcgY29tZXMgZnJvbSB0aGUgdHdvLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgcGFyYWxsZWwgYW5hbHlzaXMsIGluIHdoaWNoIGEgc2luZ2xlIF9CT0RZLUhFQVJUXyBmYWN0b3IgZW1lcmdlZCBhbmQgd2FzIGhpZ2hseSBjb25ncnVlbnQgd2l0aCBib3RoIHRoZSBfQk9EWV8gKGNvc2luZSBzaW1pbGFyaXR5OiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMSJdYCkgYW5kIF9IRUFSVF8gKGByIGNvbmdfZWZhXzJfZDJfYWRfNDZbIkYxIiwgIkYyIl1gKSBmYWN0b3JzIG9mIGFkdWx0cy4gQW1vbmcgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIHRoYXQgbG9hZGVkIHN0cm9uZ2x5ICgkXGdlcSQgMC42MCkgb24gdGhpcyBmYWN0b3Igd2VyZSBib3RoIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyAoZS5nLiwgYHIgaXRhbF9ieV9jYXBfZnVuKGVmYV8yX2QyXzQ2X2hpZ2hsb2FkJGNhcGFjaXR5W2VmYV8yX2QyXzQ2X2hpZ2hsb2FkJGFkdWx0X2ZhY3Rvcj09IkJPRFkiICYgZWZhXzJfZDJfNDZfaGlnaGxvYWQkZmFjdG9yID09ICJGMSIgJiBlZmFfMl9kMl80Nl9oaWdobG9hZCRjYXBhY2l0eSAhPSAiZ2V0IGFuZ3J5Il0pYCkgYW5kIHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgKGByIGl0YWxfYnlfY2FwX2Z1bihlZmFfMl9kMl80Nl9oaWdobG9hZCRjYXBhY2l0eVtlZmFfMl9kMl80Nl9oaWdobG9hZCRhZHVsdF9mYWN0b3I9PSJIRUFSVCIgJiBlZmFfMl9kMl80Nl9oaWdobG9hZCRmYWN0b3IgPT0gIkYxIl0pYCksIHN1Z2dlc3RpbmcgdGhhdCB5b3VuZ2VyIGNoaWxkcmVuIHBlcmNlaXZlZCBwaHlzaW9sb2dpY2FsIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0byAiZ28gdG9nZXRoZXIiIHRvIGEgY29uc2lkZXJhYmxlIGRlZ3JlZS4KCmBgYHtyfQplZmFfM19kMl80Nl9kb21DYXAgPC0gbG9hZGluZ3NfZnVuKGVmYV8zX2QyXzQ2LCAibG9uZyIpICU+JSAKICBhcnJhbmdlKGRlc2MobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoYWR1bHRfZmFjdG9yID0gY2FzZV93aGVuKAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMSIsICJwb3MiKSkgPT0gVCB+ICJCT0RZIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjIiLCAicG9zIikpID09IFQgfiAiSEVBUlQiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kMl9hZCwgMjAsICJGMyIsICJwb3MiKSkgPT0gVCB+ICJNSU5EIiwKICAgIFRSVUUgfiAibm8gZG9taW5hbnQgZmFjdG9yIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkKCmVmYV8zX2QyXzQ2X2xvd2xvYWQgPC0gbG9hZGluZ3NfZnVuKGVmYV8zX2QyXzQ2LCAibG9uZyIpICU+JSAKICBmaWx0ZXIobG9hZGluZyA8PSAwLjQwKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yLCBjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKGFkdWx0X2ZhY3RvciA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjEiLCAicG9zIikpID09IFQgfiAiQk9EWSIsCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyX2FkLCAyMCwgIkYyIiwgInBvcyIpKSA9PSBUIH4gIkhFQVJUIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfYWQsIDIwLCAiRjMiLCAicG9zIikpID09IFQgfiAiTUlORCIsCiAgICBUUlVFIH4gIm5vIGRvbWluYW50IGZhY3RvciIpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpFdmVuIGluIHRoZSAzLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbCwgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gcGh5c2lvbG9naWNhbCBhbmQgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgd2FzIHNvbWV3aGF0IGJsdXJyZWQuIFdoaWxlIHRoZSBmaXJzdCBmYWN0b3IsIHdoaWNoIHdlJ3ZlIGxhYmVsZWQgX0JPRFlcKl8sIHdhcyBoaWdobHkgY29uZ3J1ZW50IHdpdGggYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eTogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjEiLCAiRjEiXWApLCBpdCB3YXMgYWxzbyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciB0d28gc29jaWFsLWVtb3Rpb25hbCBpdGVtcyAoYHIgaXRhbF9ieV9jYXBfZnVuKGVmYV8zX2QyXzQ2X2RvbUNhcCRjYXBhY2l0eVtlZmFfM19kMl80Nl9kb21DYXAkZmFjdG9yID09ICJGMSIgJiBlZmFfM19kMl80Nl9kb21DYXAkYWR1bHRfZmFjdG9yID09ICJIRUFSVCJdKWApLiBBbmQgd2hpbGUgdGhlIHRoaXJkIGZhY3Rvciwgd2hpY2ggd2UndmUgbGFiZWxlZCBfSEVBUlRcKl8sIHdhcyBoaWdobHkgY29uZ3J1ZW50IHdpdGggYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHk6IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYzIiwgIkYyIl1gKSwgdGhlcmUgd2VyZSBzZXZlcmFsIHNvY2lhbC1lbW90aW9uYWwgaXRlbXMgdGhhdCBmYWlsZWQgdG8gbG9hZCBzdHJvbmdseSBvbiBpdCAobG9hZGluZ3MgJFxsZXEkIDAuNDA6IGByIGl0YWxfYnlfY2FwX2Z1bihlZmFfM19kMl80Nl9sb3dsb2FkJGNhcGFjaXR5W2VmYV8zX2QyXzQ2X2xvd2xvYWQkZmFjdG9yID09ICJGMyIgJiBlZmFfM19kMl80Nl9sb3dsb2FkJGFkdWx0X2ZhY3RvciA9PSAiSEVBUlQiXSlgKS4gU3RlcHBpbmcgYmFjaywgaXQgaXMgbm90IGNsZWFyIHRoYXQgInBoeXNpb2xvZ2ljYWwgdnMuIHNvY2lhbC1lbW90aW9uYWwiIGlzIHRoZSBiZXN0IHdheSB0byBjaGFyYWN0ZXJpemUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgdHdvIGZhY3RvcnMuIEluIGZhY3QsIGdpdmVuIHRoYXQgdGhlIHN0cm9uZ2VzdC1sb2FkaW5nIGl0ZW1zIGZvciBfQk9EWVwqXyB3ZXJlIG5lZ2F0aXZlbHkgdmFsZW5jZWQgKGByIGdzdWIoImFuZCAiLCAiIiwgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzQ2LCAzLCAiRjEiLCAiYWJzIikpYCkgd2hpbGUgdGhlIHN0cm9uZ2VzdC1sb2FkaW5nIGl0ZW1zIGZvciBfSEVBUlRcKl8gd2VyZSBwb3NpdGl2ZWx5IHZhbGVuY2VkIChgciBnc3ViKCJhbmQgIiwgIiIsIHRvcF9uX2RvbUNhcChlZmFfM19kMl80NiwgMywgIkYzIiwgImFicyIpKWApLCBpdCBzZWVtcyBwbGF1c2libGUgdGhhdCB0aGUgbW9yZSBzYWxpZW50IGRpc3RpbmN0aW9uIGFtb25nIHRoaXMgYWdlIGdyb3VwIG1heSBoYXZlIGJlZW4gcG9zaXRpdmUgdnMuIG5lZ2F0aXZlIHZhbGVuY2UsIHJhdGhlciB0aGFuIF9CT0RZXyB2cy4gX0hFQVJUXy4gVGhlIHNhbGllbmNlIG9uIG5lZ2F0aXZlIHZzLiBwb3NpdGl2ZSBleHBlcmllbmNlcyBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIGlzIGNvbnNpc3RlbnQgd2l0aCByZWNlbnQgd29yayBvbiB0aGUgZGV2ZWxvcG1lbnQgb2YgZW1vdGlvbiBjb25jZXB0cywgd2hpY2ggc3VnZ2VzdHMgdGhhdCBlbW90aW9uIHJlcHJlc2VudGF0aW9ucyBhcmUgZG9taW5hbnRlZCBieSBhIHNpbmdsZSBkaW1lbnNpb24gb2YgdmFsZW5jZSBpbiBlYXJseSB0byBtaWRkbGUgY2hpbGRob29kLCBiZWZvcmUgdW5mb2xkaW5nIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UgY2hhcmFjdGVyaXplZCBieSB2YWxlbmNlIGFuZCBhcm91c2FsIG92ZXIgdGhlIGNvdXJzZSBvZiBsYXRlciBjaGlsZGhvb2QgYW5kIGFkb2xlc2VuY2UgKE5vb2sgZXQgYWwuLCAyMDE3KS4KCkZpbmFsbHksIHRoZSB2ZXJ5IGZhY3QgdGhhdCBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBmYWN0b3IgcmV0ZW50aW9uIHlpZWxkZWQgZGlmZmVyZW50IHJlc3VsdHMgaXMgZnVydGhlciBldmlkZW5jZSB0aGF0LCBhbHRob3VnaCB3ZSBvYnNlcnZlZCBzb21lIGV2aWRlbmNlIGZvciBhIG5hc2NlbnQgZGlzdGluY3Rpb24gYmV0d2VlbiBfQk9EWV8gYW5kIF9IRUFSVF8gYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiwgdGhpcyBkaXN0aW5jdGlvbiB3YXMgbm90IGFzIHJvYnVzdCBhcyBpdCBhcHBlYXJlZCB0byBiZSBhbW9uZyBvbGRlciBjaGlsZHJlbiBvciBhZHVsdHMuCgojIyMgRGV2ZWxvcG1lbnRhbCBjaGFuZ2VzIGluIGF0dHJpYnV0aW9ucyBvZiBhbGwgdGhyZWUgY29tcG9uZW50cyBvZiBtZW50YWwgbGlmZeKAlF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EX+KAlGJlZ2luIGJ5IGVhcmx5IGNoaWxkaG9vZCBhbmQgY29udGludWUgaW50byBtaWRkbGUgY2hpbGRob29kCgpSZWdhcmRpbmcgb3VyIHRoaXJkIGdvYWwsIFN0dWR5IDIgcmV2ZWFsZWQgYSB3aWRlIHZhcmlldHkgb2YgYWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMsIGluIGFsbCB0aHJlZSBhc3BlY3RzIG9mIG1lbnRhbCBsaWZlIGFzIGNvbmNlcHR1YWxpemVkIGJ5IGFkdWx0cy4gIAoKSW4gU3R1ZHkgMSwgd2Ugb2JzZXJ2ZWQgdGhhdCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIF9IRUFSVF8gd2VyZSBwYXJ0aWN1bGFybHkgdW4tYWR1bHQtbGlrZTogQXMgYSBncm91cCwgdGhlc2UgY2hpbGRyZW4gYXR0cmlidXRlZCBtdWNoIG1vcmUgaW4gdGhlIHdheSBvZiBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0byBib3RoIGEgYmVldGxlIGFuZCBhIHJvYm90IHRoYW4gZGlkIGFkdWx0cyAoYWNjb3JkaW5nIHRvIGFuIGFuYWx5c2lzIG9mIGZhY3RvciBzY29yZXMsIHdpdGggY2hpbGRyZW4ncyBkYXRhIHByb2plY3RlZCBpbnRvIGFkdWx0cycgY29uY2VwdHVhbCBzcGFjZSkuIEluIHRoZSBTdHVkeSAxIHNhbXBsZSwgdGhpcyBkaWZmZXJlbmNlIGFwcGVhcmVkIHRvIGRlY2xpbmUgd2l0aCBhZ2UgYmV0d2VlbiA3LTl5LCBidXQgbmV2ZXIgcXVpdGUgcmVhY2hlZCBhZHVsdC1saWtlIGxldmVscy4KCmBgYHtyfQojIHJfZDJfNDlfcm9ib3RfSEVBUlQgPC0gYnJtKHNjb3JlIH4gYWdlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmdWxsX2pvaW4oCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMl80Nl9wcm9qZWN0X3Njb3JlcyAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lID09ICJIRUFSVCIpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDJfNDYgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QyXzc5X3Byb2plY3Rfc2NvcmVzICU+JSAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWUgPT0gIkhFQVJUIikgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSkKIyBzYXZlUkRTKHJfZDJfNDlfcm9ib3RfSEVBUlQsICIuL2JybXNfbW9kZWxzL3JfZDJfNDlfcm9ib3RfSEVBUlQucmRzIikKCnJfZDJfNDlfcm9ib3RfSEVBUlQgPC0gcmVhZFJEUygiLi9icm1zX21vZGVscy9yX2QyXzQ5X3JvYm90X0hFQVJULnJkcyIpCiMgc3VtbWFyeShyX2QyXzQ5X3JvYm90X0hFQVJUKQpgYGAKCkluIGxpbmUgd2l0aCB0aGlzLCBTdHVkeSAyIGFsc28gcmV2ZWFsZWQgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZXMgaW4gYXR0cmlidXRpb25zIG9mIF9IRUFSVF86IFJlbGF0aXZlIHRvIGFkdWx0cywgY2hpbGRyZW4gYWNyb3NzIHRoZSBhZ2UgcmFuZ2UgdGVuZGVkIHRvIG92ZXItYXR0cmlidXRlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVz4oCUbm90IG9ubHkgdG8gdGhlIHJvYm90IGFuZCB0aGUgYmVldGxlLCBidXQgdG8gbW9zdCBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSAoc2VlIEZpZ3VyZSA2KS4gQWdhaW4sIHRoaXMgdGVuZGVuY3kgZ2VuZXJhbGx5IGRlY2xpbmVkIHdpdGggYWdlLCB3aXRoIG9uZSBleGNlcHRpb246IElmIGFueXRoaW5nLCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIHRvIHJvYm90cyBhcHBlYXJlZCB0byBfaW5jcmVhc2VfIGJldHdlZW4gNC05eSBvZiBhZ2UgaW4gdGhpcyBzYW1wbGUgKHRob3VnaCBub3Qgc3Vic3RhbnRpYWxseSwgYWNjb3JkaW5nIHRvIGEgQmF5ZXNpYW4gcmVncmVzc2lvbjogYHIgd3JpdGVfYl85NUNJX2Z1bihyX2QyXzQ5X3JvYm90X0hFQVJULCAiYWdlIilgKS4gVGhlIHN1YnNldCBvZiA0LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3QgKF9uXz1gciBkMl9hbGxfY2hhciAlPiUgZmlsdGVyKGFnZV9ncm91cCAhPSAiYWR1bHRzIiwgY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JSBzdW1tYXJpc2UoTiA9IHN1bShuKSkgJT4lIGFzLm51bWVyaWMoKWApIGluIFN0dWR5IDIgY29uc3RpdHV0ZWQgYSBtdWNoIHNtYWxsZXIgc2FtcGxlIHRoYW4gdGhlIGByIGQxXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyKSAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUgbnJvdygpYCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdobyBhc3Nlc3NlZCB0aGUgcm9ib3QgaW4gU3R1ZHkgMSwgc28gdGhlICJ0cnVlIiBkZXZlbG9wbWVudGFsIHRyYWplY3Rvcnkgb2YgX0hFQVJUXyBhdHRyaWJ1dGlvbnMgdG8gcm9ib3RzIHJlbWFpbnMgdW5jbGVhci4gKFdlIHJldHVybiB0byB0aGlzIHF1ZXN0aW9uIGFybWVkIHdpdGggbW9yZSBkYXRhIGZyb20gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAzLCBhbmQgbWFrZSBmdXJ0aGVyIHJlbWFya3Mgb24gY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgdG8gcm9ib3RzIG1vcmUgZ2VuZXJhbGx5IGluIHRoZSBHZW5lcmFsIERpc2N1c3Npb24uKSBTZXR0aW5nIGFzaWRlIHJvYm90cyBmb3IgdGhlIG1vbWVudCwgb3VyIGdlbmVyYWwgdGFrZS1hd2F5cyBmcm9tIFN0dWRpZXMgMS0yIGFyZSB0aGF0IGNoaWRscmVuJ3MgYXR0cmlidXRpb25zIG9mIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzICh3aGF0IHdlIGNhbGwgX0hFQVJUXykgYXBwZWFyIHRvIHVuZGVyZ28gZXNwZWNpYWxseSBkcmFtYXRpYyBkZXZlbG9wbWVudGFsIGNoYW5nZXMgb3ZlciB0aGUgY291cnNlIG9mIGVhcmx5IGFuZCBtaWRkbGUgY2hpbGRob29kLiBUaGVzZSBjaGFuZ2VzIHNlZW0gdG8gYmUgZ2VuZXJhbGx5IG1vbm90b25pYyBpbiBuYXR1cmU7IHRoYXQgaXMsIHdlIHNlZSBncmFkdWFsIGRlY3JlYXNlcyBpbiBzb2NpYWwtZW1vdGlvbmFsIGF0dHJpYnV0aW9ucyBhY3Jvc3MgdGhlIGJvYXJkIGZyb20gNC05eSwgYW5kIG5vIHN0cm9uZyBldmlkZW5jZSBmb3Igbm9uLWxpbmVhcml0aWVzLiBGaW5hbGx5LCB0aGVzZSBkZXZlbG9wbWVudGFsIGNoYW5nZXMgYXBwZWFycyB0byBleHRlbmQgd2VsbCBpbnRvIG1pZGRsZSBjaGlsZGhvb2QsIGFuZCBwZXJoYXBzIGJleW9uZC4KCkJleW9uZCB0aGUgZ2VuZXJhbCBkZWNsaW5lIGluIF9IRUFSVF8gYXR0cmlidXRpb25zIHdpdGggYWdlLCB3ZSBhbHNvIG9ic2VydmVkIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGluIGF0dHJpYnV0aW9ucyBvZiBib3RoIF9CT0RZXyBhbmQgZXNwZWNpYWxseSBfTUlORF8sIHdoaWNoIHdlcmUgcmV2ZWFsZWQgbW9zdCBjbGVhcmx5IHRob3J1Z2ggYW4gZXhhbWluYXRpb24gb2YgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIHRvIGFuaW1hdGUgYmVpbmdzIChiZWV0bGUsIGJpcmQsIG1vdXNlLCBnb2F0LCBlbGVwaGFudCkgdnMuIGluYW5pbWF0ZSBvYmplY3RzIChjb21wdXRlciwgcm9ib3QsIGRvbGwsIHRlZGR5IGJlYXIpLiAKCkluIHRoZSBfQk9EWV8gZG9tYWluLCBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5pbWF0ZSBhbmQgaW5hbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzIHdhcyBjbGVhcmx5IHByZXNlbnQgZXZlbiBhbW9uZyB0aGUgeW91bmdlc3QgY2hpbGRyZW4sIGJ1dCBpbmNyZWFzZWQgZ3JhZHVhbGx5IGFjcm9zcyB0aGUgNC03eSBhZ2UgcmFuZ2UgKGFwcGVhcmluZyB0byByZWFjaCBhIGRlZ3JlZSBvZiBzZXBhcmF0aW9uIGNvbXBhcmFibGUgdG8gYWR1bHRzIHNvbWV0aW1lIGJldHdlZW4gNy05eTsgc2VlIEZpZ3VyZSA4KS4gQXMgZGVzY3JpYmVkIGFib3ZlLCB5b3VuZ2VyIGNoaWxkcmVuIGRpdmVyZ2VkIGZyb20gYWR1bHRzIHByaW1hcmlseSBpbiB0aGVpciBhdHRyaWJ1dGlvbnMgb2YgX0JPRFlfIHRvIHRoZSAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIHRoZSBmb2N1cyBvZiBTdHVkeSAxOiB0aGUgcm9ib3QgYW5kIHRoZSBiZWV0bGUuIExvb2tpbmcgYmFjayBhdCBTdHVkeSAxLCB3ZSBvYnNlcnZlIGEgc2ltaWxhciwgdGhvdWdoIHN1YnRsZXIsIHBhdHRlcm4gZXZlbiBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdoZW4gdGhlIHNldCBvZiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgbGltaXRlZCB0byB0aGVzZSBlZGdlIGNhc2VzLiBUYWtlbiB0b2dldGhlciwgdGhlc2UgcmVzdWx0cyBzdWdnZXN0IHRoYXQgd2hpbGUgYnkgdGhlIGFnZSBvZiA0LTZ5IGNoaWxkcmVuIGFyZSByZWxhdGl2ZWx5IGZhciBhbG9uZyBpbiB0aGVpciBtYXN0ZXJ5IG9mIHdoaWNoIGVudGl0aWVzIGluIHRoZSB3b3JsZCBhcmUgc3ViamVjdCB0byB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBfQk9EWV8sIHRoZXkgY29udGludWUgdG8gcmVmaW5lIHRoZWlyIGFwcGxpY2F0aW9uIG9mIHRoaXMgY29uY2VwdCB0aHJvdWdob3V0IGVhcmx5IChhbmQgcGVyaGFwcyBpbnRvIG1pZGRsZSkgY2hpbGRob29kLgoKRmluYWxseSwgaW4gdGhlIF9NSU5EXyBkb21haW4sIHdlIG9ic2VydmVkIHVuYW50aWNpcGF0ZWQgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZXMgdGhhdCB3ZXJlIHBlcmhhcHMgZXZlbiBtb3JlIHN0cmlraW5nIHRoYW4gdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBfSEVBUlRfIGRvbWFpbiBkZXNjcmliZWQgZWFybGllci4gUmVsYXRpdmUgdG8gYWR1bHRzLCBjaGlsZHJlbiBhY3Jvc3MgdGhlIGFnZSByYW5nZSB0ZW5kZWQgdG8gdW5kZXItYXR0cmlidXRlIHBlcmNlcHR1YWwgYW5kIGNvZ25pdGl2ZSBhYmlsaXRpZXMsIGJvdGggdG8gaW5hbmltYXRlIHRhcmdldCBjaGFyYWN0ZXJzIGFuZCBlc3BlY2lhbGx5IHRvIGFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMuIEdlbmVyYWxseSBzcGVha2luZywgY2hpbGRyZW4ncyB1bmRlci1hdHRyaWJ1dGlvbnMgb2YgX01JTkRfIGJlY2FtZSBsZXNzIHByb25vdW5jZWQgd2l0aCBhZ2XigJRidXQgZXZlbiB0aGUgb2xkZXN0IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbGVzcyBpbiB0aGUgd2F5IG9mIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyB0byBzdWNoIHRhcmdldCBjaGFyYWN0ZXJzIGFzIHRoZSBlbGVwaGFudCwgdGhlIG1vdXNlLCBhbmQgdGhlIGJpcmQgdGhhbiBkaWQgYWR1bHRzIChzZWUgRmlndXJlIDYpLgoKIyMjIyBJbnRlcmltIHN1bW1hcnkKCkluIFN0dWRpZXMgMS0yIHdlIGRvY3VtZW50ZWQgZGlmZmVyZW5jZXMgaW4gdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHVuZGVybHlpbmcgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBiZXR3ZWVuIGVhcmx5IGNoaWxkaG9vZCAoNC02eSkgYW5kIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpLCBhcyB3ZWxsIGFzIGFnZS1yZWxhdGVkIGNoYW5nZXMgaW4gY2hpbGRyZW4ncyBhcHBsaWNhdGlvbiBvZiB0aGVzZSBjb25jZXB0c+KAlGkuZS4sIHRoZWlyIGF0dHJpYnV0aW9ucyBvZiBkaWZmZXJlbnQgYXNwZWN0cyBvZiBtZW50YWwgbGlmZSB0byBkaWZmZXJlbnQgdGFyZ2V0IGNoYXJhY3RlcnPigJR3aGljaCBhcHBlYXIgdG8gYmUgdW5kZXJ3YXkgYnkgZWFybHkgY2hpbGRob29kIGFuZCBleHRlbmQgd2VsbCBpbnRvIG1pZGRsZSBjaGlsZGhvb2QgYW5kIGJleW9uZC4gV2UgaGF2ZSBpbnRlcnByZXRlZCBib3RoIGtpbmRzIG9mIGRpZmZlcmVuY2VzIGFzIGFzcGVjdHMgb2YgX2NvbmNlcHR1YWwgZGV2ZWxvcG1lbnRfIGluIHRoaXMgZG9tYWluLgoKT25lIG1ham9yIGxpbWl0YXRpb24gb2YgU3R1ZGllcyAxLTIsIGhvd2V2ZXIsIHdhcyB0aGF0IHRoZSB0YXNrIGludm9sdmVkIGEgcmF0aGVyIGFkdmFuY2VkIHNldCBvZiBtZW50YWwgc3RhdGUgdm9jYWJ1bGFyeSB0ZXJtcywgaW5jbHVkaW5nIGEgdmFyaWV0eSBvZiBjb21wbGV4IG1lbnRhbCBjYXBhY2l0aWVzIChlLmcuLCBndWlsdCwgcHJpZGUsIGF3YXJlbmVzcywgZGVwdGggcGVyY2VwdGlvbikgYW5kIHVzaW5nIHNvbWV3aGF0IGNvbXBsaWNhdGVkIHN5bnRheCBmb3Igc29tZSBpdGVtcyAoZS5nLiwgX3NlbnNlIHdoZXRoZXIgc29tZXRoaW5nIGlzIGNsb3NlIGJ5IG9yIGZhciBhd2F5XywgX2ZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaW5nc18pLiBGb3IgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiwgaW4gcGFydGljdWxhciwgc29tZSBvZiB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIG1pZ2h0IGhhdmUgYmVlbiBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgd29yZHMgdGhleSBub3JtYWxseSBoZWFyIGluIGRpc2N1c3Npb25zIG9mIG1lbnRhbCBzdGF0ZXPigJRsZXQgYWxvbmUgdGhlIHdvcmRzIHRoZXkgbm9ybWFsbHkgdXNlIHRoZW1zZWx2ZXMuIEluIGFkZGl0aW9uLCB5b3VuZ2VyIGNoaWxkcmVuIG1heSBoYXZlIGZvdW5kIHNvbWUgYXNwZWN0cyBvZiB0aGUgZXhwZXJpbWVudGFsIHBhcmFkaWdtIGRpc3RyYWN0aW5nIChlLmcuLCBiZWluZyBzZWF0ZWQgaW4gZnJvbnQgb2YgdGhlIGV4cGVyaW1lbnRlcidzIGxhcHRvcCBjb21wdXRlciB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gdXNlIGl0IHRoZW1zZWx2ZXMpIG9yIGRpZmZpY3VsdCAoZS5nLiwgdXNpbmcgYSB0aHJlZS1wb2ludCBzY2FsZSB3aXRoIG1pbmltYWwgdmlzdWFsIHNjYWZmb2xkaW5nOyBzZWUgU09NIGZvciBhbiBhbmFseXNpcyBvZiBzY2FsZSB1c2UgYWNyb3NzIGFnZSBncm91cHMpLgoKVGh1cywgaW4gb3VyIGZpbmFsIHN0dWR5LCB3ZSBmb2N1c2VkIG9uIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4sIHVzaW5nIGEgc2ltcGxlciBzZXQgb2YgbWVudGFsIGNhcGFjaXRpZXMgYW5kIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgZXhwZXJpbWVudGFsIHBhcmFkaWdtICh2YWxpZGF0ZWQgYW1vbmcgYWR1bHRzKSB3aXRoIHRoZSBhaW0gb2YgZ2V0dGluZyBhIGNsZWFyZXIgcGljdHVyZSBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbmQgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhdCB0aGlzIGVhcmxpZXIgcG9pbnQgaW4gZGV2ZWxvcG1lbnQuCgojIFN0dWR5IDMKClRoZSBwcmltYXJ5IGdvYWwgb2YgU3R1ZHkgMyB3YXMgdG8gcHJvdmlkZSBhIGNvbmNlcHR1YWwgcmVwbGljYXRpb24gYW5kIGV4dGVuc2lvbiBvZiBvdXIgZmluZGluZ3MgaW4gU3R1ZHkgMiB0aGF0IHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSB1bmRlcmx5aW5nIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYW1vbmcgcHJlc2Nob29sLWFnZSBjaGlsZHJlbiBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMsIHBhcnRpY3VsYXJseSBpbiB0ZXJtcyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gX0JPRFlfIGFuZCBfSEVBUlRfLiBJbiBsaWdodCBvZiBvdXIgY29uY2VybnMgYWJvdXQgdm9jYWJ1bGFyeSwgYXR0ZW50aW9uLCBhbmQgdXNlIG9mIHRoZSByZXNwb25zZSBzY2FsZSBhbW9uZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDIsIHdlIGRlc2lnbmVkIGFuIGV2ZW4gbW9yZSBjaGlsZC1mcmllbmRseSB2ZXJzaW9uIHNwZWNpZmljYWxseSB0YWlsb3JlZCB0byBhcHByb3ByaWF0ZSBmb3IgeW91bmcgcHJlc2Nob29sZXJzLCBieSBzdHJlYW1saW5pbmcgdGhlIGV4cGVyaW1lbnRhbCBwcm90b2NvbCwgcHJvdmlkaW5nIG1vcmUgc2NhZmZvbGRpbmcgZm9yIHRoZSByZXNwb25zZSBzY2FsZSwgYW5kIGluY2x1ZGluZyBvbmx5IHZvY2FidWxhcnkgaXRlbXMgdGhhdCB3ZXJlIHByZS10ZXN0ZWQgdG8gYmUgZmFtaWxpYXIgdG8geW91bmcgcHJlc2Nob29sIGNoaWxkcmVuIChzZWUgIk1ldGhvZCIpLiAKCkEgc2Vjb25kIGdvYWwgb2YgU3R1ZHkgMyB3YXMgdG8gYXNzZXNzIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgbWVudGFsIGxpZmUgdG8gd2hhdCB3ZSBoYXZlIGNhbGxlZCAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZzogYSBiZWV0bGUgKGFuIGF0eXBpY2FsIGFuaW1hbCkgYW5kIGEgcm9ib3QgKGFuIGF0eXBpY2FsIG9iamVjdCkuIEluIFN0dWRpZXMgMSBhbmQgMiwgY2hpbGRyZW4gb2YgYWxsIGFnZXMgYXBwZWFyIHRvIGhhdmUgYXR0cmlidXRlZCBtb3JlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIChfSEVBUlRfKSBhbmQgZmV3ZXIgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIChfTUlORF8pIHRvIGJvdGggb2YgdGhlc2UgZWRnZSBjYXNlcywgYXMgY29tcGFyZWQgdG8gYWR1bHRzLiBJbiBTdHVkeSAyLCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGFwcGVhciB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IHVuLWFkdWx0LWxpa2UgaW4gdGhlaXIgYXR0cmlidXRpb25zIHRvIHRoZSBiZWV0bGUgYW5kIHRoZSByb2JvdOKAlGJ1dCBiZWNhdXNlIHBhcnRpY2lwYW50cyB3ZXJlIGRpc3RyaWJ1dGVkIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMsIHdlIGNvdWxkIG5vdCBjaGFydCB0aGVzZSBkaWZmZXJlbmNlcyB3aXRoIGFueSBwcmVjaXNpb24uIEluIGNvbnRyYXN0LCBpbiBTdHVkeSAxIHRoZSBhcHByb2FjaCBvZiBmb2N1c2luZyBvbiAiZWRnZSBjYXNlcyIgaW4gcGFydGljdWxhciBhbGxvd2VkIHVzIHRvIGVzdGltYXRlIG9sZGVyIGNoaWxkcmVuJ3MgYWdncmVnYXRlIGF0dHJpYnV0aW9ucyB0byB0aGVzZSBlbnRpdGllcyB3aXRoIHByZWNpc2lvbiwgYmVjYXVzZSBsYXJnZSBudW1iZXJzIG9mIGNoaWxkcmVuIGFzc2Vzc2VkIGVhY2ggb2YgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycy4gSW4gU3R1ZHkgMywgd2UgcmV0dXJuZWQgdG8gdGhpcyAiZWRnZSBjYXNlIiBhcHByb2FjaCwgbGltaXRpbmcgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIHRvIGEgYmVldGxlIGFuZCBhIHJvYm90LgoKIyMgTWV0aG9kCgojIyMgUGFydGljaXBhbnRzCgpgciBkM19hZCAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBjb3VudCgpICU+JSBhcy5udW1lcmljKCkgKyBkM180NiAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBjb3VudCgpICU+JSBhcy5udW1lcmljKClgIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4gdGhpcyBzdHVkeSwgaW5jbHVkaW5nIGEgZ3JvdXAgb2YgYWR1bHRzIGFuZCBhIGdyb3VwIG9mIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4uCgpgYGB7cn0KIyBkZW1vZ3JhcGhpY3MKZDNfYWRfZ2VuZGVyIDwtIGRlbW9fZnVuKGQzX2FkLCAiZ2VuZGVyIiwgMikKZDNfYWRfZXRobmljaXR5IDwtIGRlbW9fZnVuKGQzX2FkLCAiZXRobmljaXR5X2NhdCIsIDIpCmBgYAoKQWR1bHRzIChfbl89YHIgZDNfYWQgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpYCkgcGFydGljaXBhdGVkIHZpYSBNVHVyayBpbiBTZXB0ZW1iZXIgMjAxOC4gQWR1bHQgcGFydGljaXBhbnRzIGhhZCBnYWluZWQgYXBwcm92YWwgZm9yIGF0IGxlYXN0IDk1JSBvZiB0aGVpciBwcmV2aW91cyB3b3JrIG9uIE1UdXJrOyBoYWQgTVR1cmsgYWNjb3VudHMgYmFzZWQgaW4gdGhlIFVTOyBhbmQgaW5kaWNhdGVkIHRoYXQgdGhleSB3ZXJlIGF0IGxlYXN0IDE4IHllYXJzIG9sZC4gQWR1bHRzIHdlcmUgcGFpZCBcJDAuNDUgZm9yIGFwcHJveGltYXRlbHkgMi00IG1pbnV0ZXMgb2YgdGhlaXIgdGltZSAobWVkaWFuIGR1cmF0aW9uOiBgciBzdW1tYXJ5KGQzX2FkJGR1cmF0aW9uKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYCBtaW4pLiBBbiBhZGRpdGlvbmFsIDIxIGFkdWx0cyBwYXJ0aWNpcGF0ZWQgYnV0IHdlcmUgZXhjbHVkZWQgZm9yIGZhaWxpbmcgdG8gcmVzcG9uZCBzZW5zaWJseSB0byBhbiBvcGVuLWVuZGVkIHF1ZXN0aW9uIGFib3V0IHdoYXQgdGhleSBoYWQgYmVlbiBhc2tlZCB0byBkbyBpbiB0aGUgc3R1ZHkgKHNlZSBTdHVkeSAyIGZvciBleGFtcGxlczsgX25fPTE2KSBvciBmb3IgZmFpbGluZyB0byBwYXNzIG9uZSBvciBtb3JlIGF0dGVudGlvbiBjaGVja3MgKGUuZy4sICJQbGVhc2Ugc2VsZWN0IG5vIjsgX25fPTUpLiBBY2NvcmRpbmcgdG8gc2VsZiByZXBvcnQsIHRoZSBmaW5hbCBhZHVsdCBzYW1wbGUgcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDNfYWQkYWdlKVsiTWluLiJdYC1gciBzdW1tYXJ5KGQzX2FkJGFnZSlbIk1heC4iXWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkM19hZCRhZ2UpWyJNZWRpYW4iXWB5KSBhbmQgaW5jbHVkZWQgc2xpZ2h0bHkgbW9yZSBtZW4gKGByIHJvdW5kKGQzX2FkX2dlbmRlciRwcm9wW2QzX2FkX2dlbmRlciRnZW5kZXI9PSJtIl0sIDIpICogMTAwYCUpIHRoYW4gd29tZW4gKGByIHJvdW5kKGQzX2FkX2dlbmRlciRwcm9wW2QzX2FkX2dlbmRlciRnZW5kZXI9PSJmIl0sIDIpICogMTAwYCUpLiBBZHVsdHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIFdoaXRlIChgciBkM19hZF9ldGhuaWNpdHkkcHJvcFtkM19hZF9ldGhuaWNpdHkkZXRobmljaXR5X2NhdD09IndoaXRlIl0gKiAxMDBgJTsgYHIgZDNfYWRfZXRobmljaXR5JHByb3BbZDNfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJibGFjayJdICogMTAwYCUgaWRlbnRpZmllZCBhcyBCbGFjazsgYHIgZDNfYWRfZXRobmljaXR5JHByb3BbZDNfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJtdWx0aSJdICogMTAwYCUgaWRlbnRpZmllZCBhcyBtb3JlIHRoYW4gb25lIHJhY2UvZXRobmljaXR5LCBhbmQgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDNfYWRfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eV9jYXQgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHkpLgoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQzXzQ2X2dlbmRlciA8LSBkZW1vX2Z1bihkM180NiwgImdlbmRlciIsIDIpCmQzXzQ2X2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkM180NiwgImV0aG5pY2l0eSIsIDIpCmBgYAoKKipYWCBDSEVDSyBXSEVOIFNBTVBMRSBJUyBDT01QTEVURSoqOiBPdXIgcGxhbm5lZCBzYW1wbGUgc2l6ZSB3YXMgMTAwIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4uIE91ciBmaW5hbCBzYW1wbGUgb2YgY2hpbGRyZW4gKF9uXz1gciBkM180NiAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBjb3VudCgpICU+JSBhcy5udW1lcmljKClgKSByYW5nZWQgaW4gYWdlIGZyb20gYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgLWByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYHkpLCBhbmQgcGFydGljaXBhdGVkIGF0IGEgdW5pdmVyc2l0eS1hZmZpbGlhdGVkIHByZXNjaG9vbCBpbiB0aGUgQmF5IEFyZWEgYmV0d2VlbiBKYW51YXJ5LVhYIDIwMTguIFdlIGRpZCBub3QgcmVjb3JkIHN0dWR5IGR1cmF0aW9uLiBBY2NvcmRpbmcgdG8gc2Nob29sIHJlY29yZHMsIHRoZSBzYW1wbGUgb2YgeW91bmdlciBjaGlsZHJlbiBpbmNsdWRlZCBzbGlnaHRseSBtb3JlIGdpcmxzIChgciBkM180Nl9nZW5kZXIkcHJvcFtkM180Nl9nZW5kZXIkZ2VuZGVyPT0iZiJdICogMTAwYCUpIHRoYW4gYm95cyAoYHIgZDNfNDZfZ2VuZGVyJHByb3BbZDNfNDZfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlKS4gQ2hpbGRyZW4gd2VyZSBwcmVkb21pbmFudGx5IGlkZW50aWZpZWQgYXMgV2hpdGUgKGByIGQzXzQ2X2V0aG5pY2l0eSRwcm9wW2QzXzQ2X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJ3aGl0ZSJdICogMTAwYCUpIG9yIG11bHRpcmFjaWFsIChgciBkM180Nl9ldGhuaWNpdHkkcHJvcFtkM180Nl9ldGhuaWNpdHkkZXRobmljaXR5PT0ibXVsdGkiXSAqIDEwMGAlOyAkXGxlcSQgYHIgZGF0YS5mcmFtZShkM180Nl9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5ICVpbiUgYygid2hpdGUiLCAibXVsdGkiLCAiTUlTU0lORyIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBvZiBjaGlsZHJlbiB3ZXJlIGlkZW50aWZpZWQgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5LCBhbmQgYHIgZDNfNDZfZXRobmljaXR5JHByb3BbZDNfNDZfZXRobmljaXR5JGV0aG5pY2l0eT09Ik1JU1NJTkciXSAqIDEwMGAlIG9mIGNoaWxkcmVuJ3MgcGFyZW50cyBkZWNsaW5lZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZWlyIHJhY2UvZXRobmljaXR5KS4KCkFuIGFkZGl0aW9uYWwgWFggY2hpbGRyZW4gcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBiZWluZyBvdXRzaWRlIHRoZSB0YXJnZXQgYWdlIHJhbmdlcy4KCiMjIyBNYXRlcmlhbHMgYW5kIHByb2NlZHVyZSAKCk1hdGVyaWFscyBhbmQgcHJvY2VkdXJlIHdlcmUgYWRhcHRlZCB0byBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB5b3VuZyBwcmVzY2hvb2xlcnMsIHdpdGggdHdvIHByaW1hcnkgZ29hbHMgaW4gbWluZDogU3RyZWFtbGluaW5nIHRoZSBleHBlcmltZW50YWwgcHJvdG9jb2wgdG8gaW1wcm92ZSBjaGlsZHJlbidzIGNvbXByZWhlbnNpb24gYW5kIGF0dGVudGlvbiB0byB0aGUgdGFzaywgYW5kIGxpbWl0aW5nIG1lbnRhbCBjYXBhY2l0aWVzIHRvIHdvcmRzIHRoYXQgYXJlIGhpZ2hseSBmYW1pbGlhciB0byB5b3VuZyBwcmVzY2hvb2wgY2hpbGRyZW4uCgpJbiBvcmRlciB0byBzdHJlYW1saW5lIHRoZSBleHBlcmltZW50YWwgcHJvdG9jb2wsIHdlIG1vdmVkIHRoZSB0YXNrIG9mZiBvZiB0aGUgY29tcHV0ZXIgKGZvciBjaGlsZHJlbiBidXQgbm90IGFkdWx0cyksIGluc3RlYWQgdXNpbmcgcHJpbnRlZCBwaG90b2dyYXBocyBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgKG1lYXN1cmluZyBhcHByb3hpbWF0ZWx5IDUgeCA4IGluY2hlcywgcHJpbnRlZCBpbiBjb2xvciBhbmQgbGFtaW5hdGVkKSBhbmQgcmVjb3JkaW5nIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGJ5IGhhbmQuIEF0IHRoZSB0aW1lIG9mIHRlc3RpbmcsIHRoZSBleHBlcmltZW50ZXIgYW5kIGNoaWxkIHNhdCBzaWRlIGJ5IHNpZGUgYXQgYSB0YWJsZSwgd2l0aCB0aGUgcGhvdG9ncmFwaCBwbGFjZWQgb24gdGhlIHRhYmxlIGRpcmVjdGx5IGluIGZyb250IG9mIHRoZSBjaGlsZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiAKCldlIGFsc28gc3RyZWFtbGluZWQgdGhlIGludHJvZHVjdGlvbiB0byB0aGUgdGFzay4gVGhlIGV4cGVyaW1lbnRlciBiZWdhbiBieSBwbGFjaW5nIHRoZSBwaG90b2dyYXBoIG9mIHRoZSBmaXJzdCB0YXJnZXQgY2hhcmFjdGVyIGluIGZyb250IG9mIHRoZSBjaGlsZCBhbmQgYXNraW5nLCAiQ2FuIHlvdSB0ZWxsIG1lIHdoYXQgdGhpcyBpcz8iIElmIGEgY2hpbGQgcHJvdmlkZWQgYW4gYW5zd2VyIG90aGVyIHRoYW4gImJlZXRsZSIgb3IgInJvYm90LCIgdGhlIGV4cGVyaW1lbnRlciBzYWlkIHNvbWV0aGluZyB0byB0aGUgZWZmZWN0IG9mLCAiSSdtIGdvaW5nIHRvIGNhbGwgaXQgYSBbYmVldGxlL3JvYm90XSI7IG90aGVyd2lzZSwgdGhlIGV4cGVyaW1lbnRlciBhZmZpcm1lZCB0aGUgY2hpbGQncyBjb3JyZWN0IHJlc3BvbnNlLiBUaGUgZXhwZXJpbWVudGVyIHRoZW4gc2FpZCwgIldlJ3JlIGdvaW5nIHRvIHBsYXkgYSBnYW1lIGFib3V0IFtiZWV0bGVzL3JvYm90c10iOyByZW1pbmRlZCBjaGlsZHJlbiwgIklmIHlvdSBldmVyIHdhbnQgdG8gc3RvcCBwbGF5aW5nLCB5b3UgY2FuIGp1c3QgbGV0IG1lIGtub3cgYW5kIHdlJ2xsIGdvIGJhY2sgdG8gdGhlIGNsYXNzcm9vbSIgKHBlciB0aGlzIHVuaXZlcnNpdHkgcHJlc2Nob29sJ3MgcHJvdG9jb2wpOyBhbmQgdGhlbiBsYXVuY2hlZCBkaXJlY3RseSBpbnRvIHRoZSBmaXJzdCBxdWVzdGlvbiAoZS5nLiwgIkNhbiBiZWV0bGVzIGdldCBzYWQ/IikuCgpXZSBzY2FmZm9sZGVkIGNoaWxkcmVuJ3MgdXNlIG9mIHRoZSB0aHJlZS1wb2ludCByZXNwb25zZSBzY2FsZSBieSBwcm92aWRpbmcgYSBwaHlzaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGUsIGNvbnNpc3Rpbmcgb2YgdGhyZWUgbGFyZ2UgYm94ZXMsIHNlcGFyYXRlZCBieSBibGFuayBzcGFjZSwgY29udGFpbmluZyB0aGUgd29yZHMgIk5PLCIgIktJTkRBLCIgYW5kICJZRVMiIHdyaXR0ZW4gaW4gbGFyZ2UgZm9udCB3aXRoIGFsbCBjYXBpdGFsIGxldHRlcnMgKHRvIGFpZCBjaGlsZHJlbiB3aXRoIGF0IGxlYXN0IHNvbWUgcmVhZGluZyBza2lsbHMgaW4gcmVjb2duaXppbmcgdGhlc2Ugd29yZHMpOyBjb2xvci1jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGludGVuc2l0eSBvZiByZXNwb25zZSAoTk8gPSB2ZXJ5IGxpZ2h0IGJsdWUsIEtJTkRBID0gbWVkaXVtIGJsdWUsIFlFUyA9IGRhcmsgYmx1ZSk7IGFuZCBvcmRlcmVkIGZyb20gbGVmdCAoTk8pIHRvIHJpZ2h0IChZRVMpLiBFYWNoIGJveCBtZWFzdXJlZCBhcHByb3hpbWF0ZWx5IDIgeCA0IGluY2hlczsgdGhlIGJveGVzIHdlcmUgbGFtaW5hdGVkIHdpdGggc2xpZ2h0bHkgbGVzcyB0aGFuIDEgaW5jaCBvZiBlbXB0eSBzcGFjZSBiZXR3ZWVuIHRoZW0gKHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIHdhcyB2aXNpYmxlKS4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIHRoZXNlIHZpc3VhbCBhbmQgc3BhdGlhbCBjdWVzIHRvIHRoZSBmYWN0IHRoYXQgdGhlcmUgd2VyZSB0aHJlZSByZXNwb25zZSBvcHRpb25z4oCUbm8sIHllcywgYW5kIHNvbWV0aGluZyBjb25jZXB0dWFsbHkgYW5kIGxpdGVyYWxseSAiaW4gYmV0d2VlbiIgdGhlc2UgZXh0cmVtZXPigJR3ZSBhbHNvIGFkZGVkIGEgbGluZSB0byB0aGUgZXhwZXJpbWVudGVyJ3Mgc2NyaXB0IGRlc2NyaWJpbmcgKGFuZCB0aGVuIHJlaXRlcmF0aW5nKSB0aGVzZSByZXNwb25zZSBvcHRpb25zIG9uIHRoZSBmaXJzdCB0aHJlZSB0cmlhbHMgKCJZb3UgY2FuIHNheSBubyBbcG9pbnRpbmcgdG8gTk9dLCBraW5kYSBbcG9pbnRpbmcgdG8gS0lOREFdLCBvciB5ZXMgW3BvaW50aW5nIHRvIFlFU10iKS4gVGhlIGV4cGVyaW1lbnRlciByZXBlYXRlZCB0aGVzZSBvcHRpb25zIG9uIHRoZSBmaXJzdCB0aHJlZSB0cmlhbHMgZm9yIGFsbCBjaGlsZHJlbiwgYW5kIG9uIGFueSBvdGhlciB0cmlhbHMgd2hlcmUgYSBjaGlsZCB0b29rIG1vcmUgdGhhbiBhIGZldyBzZWNvbmRzIHRvIGFuc3dlciBvciBwcm92aWRlZCBhIHJlc3BvbnNlIG90aGVyIHRoYW4gc2F5aW5nICJ5ZXMsIiAia2luZGEsIiBvciAibm8iIG9yIGNsZWFybHkgcG9pbnRpbmcgdG8gb25lIG9mIHRoZXNlIG9wdGlvbnMgb24gdGhlIHJlc3BvbnNlIHNjYWxlLgoKRm9yIGVhY2ggb2YgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycyAoYmVldGxlLCByb2JvdCksIGNoaWxkcmVuIGFuc3dlcmVkIDE4IHF1ZXN0aW9ucyBhYm91dCBpdHMgbWVudGFsIGNhcGFjaXRpZXMuIFRoZXNlIGl0ZW1zIHdlcmUgY2hvc2VuIHRvIGJlIGFzIHNob3J0IGFzIHBvc3NpYmxlIGFuZCB0byBiZSBoaWdobHkgZmFtaWxpYXIgdG8geW91bmcgcHJlc2Nob29sIGNoaWxkcmVuLiBUaGV5IHdlcmUgc2VsZWN0ZWQgZnJvbSBhIGxhcmdlciBwaWxvdCBzdHVkeSBpbiB3aGljaCB3ZSBhc2tlZCAzLSB0byA1LXllYXItb2xkIGNoaWxkcmVuIHRvIGNvbXBsZXRlIHN0b3JpZXMgdGhhdCBiZWdhbiB3aXRoIGVhY2ggb2YgdGhlc2UgbWVudGFsIGNhcGFjaXRpZXMgYXMgYSBwcmVtaXNlIChlLmcuLCAiTGV0J3MgaW1hZ2luZSBhIHBlcnNvbiB3aG8gX2xvdmVzIHNvbWVvbmVfLiBXaGF0IGhhcHBlbnMgbmV4dD8iOyAiTm93IGxldCdzIHByZXRlbmQgdGhhdCBzb21lb25lIF9yZW1lbWJlcnMgc29tZXRoaW5nXy4gV2hhdCBoYXBwZW5zIG5leHQ/IikgYW5kIGp1ZGdlZCB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHRoZWlyIHN0b3J5IGNvbXBsZXRpb24uIAoKRm9yIHRoZSBmaW5hbCBzZXQgb2YgcXVlc3Rpb25zLCB3ZSBhaW1lZCB0byBzZWxlY3Qgc2l4IGNsZWFyIGV4YW1wbGVzIG9mIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyAoX0JPRFlfKSwgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgKF9IRUFSVF8pLCBhbmQgcGVyY2VwdHVhbC1jb2duaXRpdmUgY2FwYWNpdGllcyAoX01JTkRfKSwgYWNjb3JkaW5nIHRvIFN0dWRpZXMgMS0yIGFuZCBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCBzdHVkaWVzIHdpdGggVVMgYWR1bHRzLiBXZSByZWFzb25lZCB0aGF0IGlmIHRoZXNlIGNhcmVmdWxseSBzZWxlY3RlZCBleGFtcGxlcyBvZiBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc3RpbGwgZWxpY2l0ZWQgZGlmZmVyZW5jZXMgaW4gY29ycmVsYXRpb25hbCBzdHJ1Y3R1cmVzIGJldHdlZW4gNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiBhbmQgYWR1bHRzLCB0aGlzIHdvdWxkIGJlIHBhcnRpY3VsYXJseSBzdHJvbmcgZXZpZGVuY2Ugb2YgYWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiBjb25jZXB0dWFsIHN0cnVjdHVyZS4KClRoZSBmaW5hbCBzZXQgb2YgX0JPRFlfIGl0ZW1zIGluY2x1ZGVkIF9mZWVsIGh1bmdyeV8sIF9nZXQgdGhpcnN0eV8sIF9mZWVsIHNpY2tfLCBfZmVlbCB0aXJlZF8sIF9nZXQgc2NhcmVkXywgYW5kIF9zbWVsbCB0aGluZ3NfLiBfSEVBUlRfIGl0ZW1zIGluY2x1ZGVkIF9sb3ZlIHNvbWVvbmVfLCBfaGF0ZSBzb21lb25lXywgX2ZlZWwgaGFwcHlfLCBfZ2V0IHNhZF8sIF9mZWVsIHNvcnJ5XywgYW5kIF9nZXQgbG9uZWx5Xy4gX01JTkRfIGl0ZW1zIGluY2x1ZGVkIF9zZWVfLCBfaGVhcl8sIF90aGlua18sIF9yZW1lbWJlciB0aGluZ3NfLCBfa25vdyBzdHVmZl8sIGFuZCBfZmlndXJlIHRoaW5ncyBvdXRfLiBXZSBlbnN1cmVkIHRoYXQgZWFjaCBjYXRlZ29yeSBpbmNsdWRlZCBhIHZhcmlldHkgb2YgcGhyYXNpbmdzIChlLmcuLCAiX2ZlZWxfIGh1bmdyeSIgdnMuICJfZ2V0XyB0aGlyc3R5IjsgInJlbWVtYmVyIF90aGluZ3NfIiB2cy4gImtub3cgX3N0dWZmXyIpIGFuZCB2YWxlbmNlcyB3aGVuIGFwcHJvcHJpYXRlIChlLmcuLCBoYXBwaW5lc3MgdnMuIHNhZG5lc3MpOyB3aGVuIHBvc3NpYmxlLCB3ZSBhaW1lZCB0byBoYXZlIHRoZXNlIGFzcGVjdHMgb2YgcGhyYXNpbmcgdmFyeSBvcnRob2dvbmFsbHkgd2l0aCBjYXRlZ29yaWVzLCBzdWNoIHRoYXQgImdldCIgYW5kICJmZWVsIiBhcHBlYXJlZCByb3VnaGx5IGVxdWFsbHkgb2Z0ZW4gYW1vbmcgdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBpdGVtcywgYW5kICJ0aGluZ3MiIGFwcGVhcmVkIGVxdWFsbHkgb2Z0ZW4gYW1vbmcgdGhlIF9CT0RZXyBhbmQgX01JTkRfIGl0ZW1zLiBBcyBpbiBTdHVkaWVzIDEtMiwgZWFjaCBtZW50YWwgY2FwYWNpdHkgd2FzIGFzc29jaWF0ZWQgd2l0aCBhIHNob3J0LCBwcmVzZXQgZGVmaW5pdGlvbiwgd2hpY2ggd2FzIHJlYWQgdG8gY2hpbGRyZW4gaWYgdGhleSBleHByZXNzZWQgdW5jZXJ0YWludHkgYWJvdXQgd2hhdCBhIHdvcmQgbWVhbnQgb3IgZGlkIG5vdCByZXNwb25kIGFmdGVyIHByb21wdGluZyB1c2Ugb2YgdGhlIHJlc3BvbnNlIHNjYWxlIChzZWUgU09NKS4KCkNoaWxkcmVuIGZpcnN0IGFzc2Vzc2VkIGFsbCAxOCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMgKGUuZy4sIHRoZSBiZWV0bGUpLCB0aGVuIGNvbXBsZXRlZCBhbiBlYXN5IGppZ3NhdyBwdXp6bGUgZmVhdHVyaW5nIGNsb3RoaW5nIGFuZCBhY2Nlc3NvcmllcyBhcHByb3ByaWF0ZSBmb3IgYSByYWlueSBkYXkgKHdoaWNoIHRvb2sgYWJvdXQgMzAtNjAgcyB0byBjb21wbGV0ZSksIGFuZCBmaW5hbGx5IGFzc2Vzc2VkIGFsbCAxOCBtZW50YWwgY2FwYWNpdGllcyBmb3IgdGhlIG90aGVyIHRhcmdldCBjaGFyYWN0ZXIgKGUuZy4sIHRoZSByb2JvdCkuCgpUaGlzIG1vZGlmaWVkIHByb2NlZHVyZeKAlHBhcnRpY3VsYXJseSBtb3ZpbmcgdGhlIGV4cGVyaW1lbnQgb2ZmIG9mIHRoZSBjb21wdXRlciBmb3IgY2hpbGRyZW7igJRyZXF1aXJlZCBzZXZlcmFsIGNoYW5nZXMgdG8gdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24uIFJhdGhlciB0aGFuIHJhbmRvbWx5IGFzc2lnbmluZyBjaGlsZHJlbiB0byBhc3Nlc3MgdGhlIGJlZXRsZSBmaXJzdCBvciB0aGUgcm9ib3QgZmlyc3QsIHRoZSBvcmRlciBvZiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgY291bnRlcmJhbGFuY2VkIGluIGFkdmFuY2UuIExpa2V3aXNlLCByYXRoZXIgdGhhbiBhc2tpbmcgYWJvdXQgdGhlIDE4IG1lbnRhbCBjYXBhY2l0aWVzIGluIGEgcmFuZG9tIG9yZGVyLCBxdWVzdGlvbnMgYWJvdXQgdGhlIGZpcnN0IHRhcmdldCBjaGFyYWN0ZXIgd2VyZSBhc2tlZCBpbiBvbmUgb2YgOCBwcmUtbWFkZSByYW5kb20gb3JkZXJzLCBhbmQgcXVlc3Rpb25zIGFib3V0IHRoZSBzZWNvbmQgdGFyZ2V0IGNoYXJhY3RlciB3ZXJlIGFza2VkIGluIHRoZSByZXZlcnNlIG9yZGVyLiBUaGUgb3JkZXIgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIChiZWV0bGUtcm9ib3Qgb3Igcm9ib3QtYmVldGxlKSBhbmQgdGhlIG9yZGVyIG9mIHRoZSBtZW50YWwgY2FwYWNpdHkgcXVlc3Rpb25zIChzZXF1ZW5jZXMgMS04KSB3ZXJlIGZ1bGx5IGNyb3NzZWQgYWNyb3NzIHBhcnRpY2lwYW50cy4gCgpBZHVsdHMgcGFydGljaXBhdGVkIGluIGFuIG9ubGluZSB2ZXJzaW9uIG9mIHRoaXMgc2FtZSB0YXNrLCB3aXRob3V0IGEgYnJlYWsgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycy4gQXMgaW4gU3R1ZGllcyAxLTIsIGFkdWx0cyBjbGlja2VkIHRocm91Z2ggYSB3ZWJzaXRlIGF0IHRoZWlyIG93biBwYWNlLCB3aXRoIG9uZSB0cmlhbCBwcmVzZW50ZWQgb24gZWFjaCBwYWdlIGFuZCBubyBhYmlsaXR5IHRvIGdvIGJhY2t3YXJkcy4gCgojIyMgRGF0YSBwcm9jZXNzaW5nCgpXZSBkaWQgbm90IHJlY29yZCByZXNwb25zZSB0aW1lcyBvciB1c2UgdGhpcyBhcyBhIGNyaXRlcmlvbiBmb3IgaW5jbHVzaW9uLiBBcyBpbiBTdHVkaWVzIDEtMiwgd2UgcmV0YWluZWQgcGFydGljaXBhbnRzIHJlZ2FyZGxlc3Mgb2Ygc2tpcHBlZCB0cmlhbHMgKF9uXz1YWCB0cmlhbHMgYW1vbmcgY2hpbGRyZW47IFhYJSBvZiBhbGwgdHJpYWxzKS4KCkZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLiAoMjAxNywgU3R1ZHkgNCksIGZvciBvdXIgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIHdlIHRyZWF0ZWQgZWFjaCBwYXJ0aWNpcGFudCdzIGFzc2Vzc21lbnRzIG9mIGVhY2ggdGFyZ2V0IGNoYXJhY3RlciBhcyBhIHNlcGFyYXRlIHNldCBvZiBvYnNlcnZhdGlvbnMgKGFzIGlmIHRoZXkgY2FtZSBmcm9tIGRpZmZlcmVudCBwYXJ0aWNpcGFudHMpLiBUaGlzIGVmZmVjdGl2ZWx5IGRvdWJsZWQgb3VyIHNhbXBsZSBzaXplIHRvIGByIG5yb3coZDNfYWQpYCBhZHVsdHMgYW5kIGByIG5yb3coZDNfNDYpYCBjaGlsZHJlbi4gKFNlZSBTT00gZm9yIHNlcGFyYXRlIEVGQXMgb2YgdGhlIHBhcnRpY2lwYW50cycgcmVzcG9uc2VzIHRvIHRoZSBmaXJzdCB0YXJnZXQgY2hhcmFjdGVyIHRoYXQgdGhleSB3ZXJlIGFzc2lnbmVkIHRvIHJhdGUgdnMuIHRoZSBzZWNvbmQgY2hhcmFjdGVyLikKCiMjIFJlc3VsdHMKCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZTogQWR1bHRzCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDNfYWQgPC0gZmEucGFyYWxsZWwoZDNfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkbmZhY3QKbmZhY3RfYmljX2QzX2FkIDwtIHZzcyhkM19hZF93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtLCBwbG90ID0gRikkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QzX2FkIDwtIHJldGVuX2Z1bihkM19hZF93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kM19hZCwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDNfYWQsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QzX2FkKQpgYGAKCmBgYHtyfQplZmFfNF9kM19hZCA8LSBmYV9mdW4oZDNfYWRfd2lkZV9pLCA0KQpgYGAKCkFsbCBvZiBvdXIgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMgc3VnZ2VzdGVkIHJldGFpbmluZyB0aHJlZSBmYWN0b3JzLgoKYGBge3J9CmVmYV8zX2QzX2FkIDwtIGZhX2Z1bihkM19hZF93aWRlX2ksIDMpCmVmYV8zX3Bsb3RfZDNfYWQgPC0gaGVhdG1hcF9mdW4oZWZhXzNfZDNfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkJPRFkiLCAiSEVBUlQiLCAiTUlORCIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQWR1bHRzIikpCmBgYAoKQXMgZXhwZWN0ZWQsIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSByZXZlYWxlZCBieSB0aGlzIGFuYWx5c2lzIGFtb25nIGFkdWx0cyB3YXMgY2hhcmFjdGVyaXplZCBieSBhIHRocmVlLXdheSBkaXN0aW5jdGlvbiBiZXR3ZWVuIF9CT0RZXyAoZmlyc3QgZmFjdG9yLCBgciByb3VuZChlZmFfM19kM19hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uKSwgX0hFQVJUXyAoc2Vjb25kIGZhY3RvciwgYHIgcm91bmQoZWZhXzNfZDNfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiBzaGFyZWQgdmFyaWFuY2UpLCBhbmQgX01JTkRfICh0aGlyZCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QzX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2Ygc2hhcmVkIHZhcmlhbmNlKS4gU2VlIEZpZ3VyZSA5LCBQYW5lbCBDLgoKVGhpcyBzdWdnZXN0cyB0aGF0IG91ciBtb2RpZmllZCBwcmVzY2hvb2xlci1mcmllbmRseSBwYXJhZGlnbSB3YXMgdmFsaWQ6IFVzaW5nIHNpbXBsZXIgdm9jYWJ1bGFyeSBhbmQgYSB3aXRoaW4tc3ViamVjdHMgYXBwcm9hY2ggdG8gdGFnZXQgY2hhcmFjdGVycyBlbGljaXRlZCB0aGUgc2FtZSBpbnR1aXRpdmUgb250b2xvZ3kgb2YgbWVudGFsIGxpZmUsIGFtb25nIFVTIGFkdWx0cywgdGhhdCB3YXMgcmV2ZWFsZWQgaW4gU3R1ZGllcyAxLTIgYW5kIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHByZXZpb3VzIHdvcmsuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBDaGlsZHJlbiAoNC01eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kM180NiA8LSBmYS5wYXJhbGxlbChkM180Nl93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSRuZmFjdApuZmFjdF9iaWNfZDNfNDYgPC0gdnNzKGQzXzQ2X3dpZGVfaSwgY29yID0gY2hvc2VuX2Nvciwgcm90YXRlID0gY2hvc2VuX3JvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0sIHBsb3QgPSBGKSR2c3Muc3RhdHMkQklDICU+JSB3aGljaC5taW4oKQpuZmFjdF93ZG1fZDNfNDYgPC0gcmV0ZW5fZnVuKGQzXzQ2X3dpZGVfaSwgcm90X3R5cGUgPSBjaG9zZW5fcm90KQoKY2F0KCJQYXJhbGxlbCBhbmFseXNpczogIiwgbmZhY3RfcGFyX2QzXzQ2LAogICAgIlxuTWluaW1pemluZyBCSUM6ICIsIG5mYWN0X2JpY19kM180NiwKICAgICJcbldlaXNtYW4gZXQgYWwuOiAiLCBuZmFjdF93ZG1fZDNfNDYpCmBgYAoKYGBge3J9CmVmYV8xX2QzXzQ2IDwtIGZhX2Z1bihkM180Nl93aWRlX2ksIDEpCmBgYAoKQXMgaW4gU3R1ZHkgMiwgb3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIGVhY2ggc3VnZ2VzdGVkIHJldGFpbmluZyBkaWZmZXJlbnQgbnVtYmVycyBvZiBmYWN0b3JzOiBJbiB0aGlzIGNhc2UsIFdlaXNtYW4gZXQgYWwuJ3MgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSBzdWdnZXN0ZWQgcmV0YWluaW5nIGByIG5mYWN0X3dkbV9kM180NmAgZmFjdG9ycywgcGFyYWxsZWwgYW5hbHlzaXMgc3VnZ2VzdGVkIHJldGFpbmluZyBgciBuZmFjdF9wYXJfZDNfNDZgIGZhY3RvcnMsIGFuZCBtaW5pbWl6aW5nIEJJQyBzdWdnZXN0ZWQgYSBudWxsLCBgciBuZmFjdF9iaWNfZDNfNDZgLWZhY3RvciBzb2x1dGlvbi4gSGVyZSB3ZSBwcmVzZW50IGJvdGggdGhlIGZvdXItIGFuZCB0aHJlZS1mYWN0b3Igc29sdXRpb25zLiAoU2VlIFNPTSBmb3IgZmFjdG9yIGxvYWRpbmdzIG9uIHRoZSBvbmUgImZhY3RvciIgaW4gdGhlIG51bGwsIG9uZS1mYWN0b3Igc29sdXRpb24uKQoKIyMjIyBGb3VyLWZhY3RvciBzb2x1dGlvbgoKYGBge3J9CmVmYV80X2QzXzQ2IDwtIGZhX2Z1bihkM180Nl93aWRlX2ksIDQpCgplZmFfNF9wbG90X2QzXzQ2IDwtIGhlYXRtYXBfZnVuKGVmYV80X2QzXzQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIk1JTkQqIiwgIkJPRFkgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFkgSUkiLCAiSEVBUlQqIikpICsKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJDaGlsZHJlbiAoNC01eSk6IDQtZmFjdG9yIHNvbHV0aW9uIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KY29uZ19lZmFfNF9kM19hZF80NiA8LSBmYS5jb25ncnVlbmNlKGVmYV80X2QzXzQ2JGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhXzNfZDNfYWQkbG9hZGluZ3MpCmBgYAoKSW4gdGhlIHJvdGF0ZWQgZm91ci1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IFdlaXNtYW4gZXQgYWwuJ3MgcmV0ZW50aW9uIGNyaXRlcmlhLCB0aGUgZmlyc3QgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIHNvbWUgcG9zaXRpdmUgZW1vdGlvbnMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjEiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjEiLCAiRjIiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMSIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfNF9kM180NiwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzRfZDNfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIGZvdXItZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zLCBhcyB3ZWxsIGFzIG9uZSBuZWdhdGl2ZSBlbW90aW9uIChfZ2V0IHNhZF8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkYyIiwgIkYxIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjIiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzRfZDNfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV80X2QzXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCBmb3VyLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgdGhpcmQgZmFjdG9yIGFsc28gY29ycmVzcG9uZGVkIHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgYXMgd2VsbCBhcyBvbmUgcGVyY2VwdHVhbCBhYmlsaXR5IChfc2VlXykuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGluZGljYXRlZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjMiLCAiRjEiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjMiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGMyIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfNF9kM180NiwgNCwgIkYzIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzRfZDNfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjMiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIGZvdXItZmFjdG9yIHNvbHV0aW9uLiAKCkZpbmFsbHksIHRoZSBmb3VydGggZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMsIHdpdGggcGFydGljdWxhcmx5IHN0cm9uZyBsb2FkaW5ncyBmb3IgbmVnYXRpdmUgZW1vdGlvbnMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGluZGljYXRlZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV80X2QzX2FkXzQ2WyJGNCIsICJGMiJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzRfZDNfYWRfNDZbIkY0IiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfNF9kM19hZF80NlsiRjQiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzRfZDNfNDYsIDQsICJGNCIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV80X2QzXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkY0Il0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCBmb3VyLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgOSwgUGFuZWwgQSwgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKV2Ugd291bGQgZGVzY3JpYmUgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhcyByZW1pbmlzY2VudCBvZiB0aGUgX0JPRFlfLV9IRUFSVF8tX01JTkRfIHN0cnVjdHVyZSBmb3VuZCBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBidXQgbm90IGFzIGZ1bGx5ICJhZHVsdC1saWtlLiIgSW4gcGFydGljdWxhciwgaW4gdGhpcyBzdHJ1Y3R1cmUsIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIF9IRUFSVF8gYW1vbmcgb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cyBhcmUgbm90IGFzIGNsZWFybHkgZGlmZmVyZW50aWF0ZWQgZnJvbSBlaXRoZXIgdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgX0JPRFlfIG9yIHRoZSBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgb2YgdGhlIF9NSU5EXy4gTW9yZW92ZXLigJRpbiBhIGRpdmVyZ2VuY2UgZnJvbSBhbnkgb2YgdGhlIHByZXZpb3VzIHN0dWRpZXPigJRpbiB0aGlzIGNhc2UgdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgX0JPRFlfIGFyZSBzcGxpdCBhY3Jvc3MgdHdvIGZhY3RvcnMuIAoKIyMjIyBUaHJlZS1mYWN0b3Igc29sdXRpb24KCmBgYHtyfQplZmFfM19kM180NiA8LSBmYV9mdW4oZDNfNDZfd2lkZV9pLCAzKQoKZWZhXzNfcGxvdF9kM180NiA8LSBoZWF0bWFwX2Z1bihlZmFfM19kM180NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIk1JTkQqIiwgIkhFQVJUKiIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQ2hpbGRyZW4gKDQtNXkpOiAzLWZhY3RvciBzb2x1dGlvbiIpKSArCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzNfZDNfYWRfNDYgPC0gZmEuY29uZ3J1ZW5jZShlZmFfM19kM180NiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QzX2FkJGxvYWRpbmdzKQpgYGAKCkluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgcGFyYWxsZWwgYW5hbHlzaXMsIHRoZSBmaXJzdCBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMSIsICJGMSJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QzXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kM180NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIG9uZSBwb3NpdGl2ZSBlbW90aW9uIChfZmVlbCBoYXBweV8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYyIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kM19hZF80NlsiRjIiLCAiRjEiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDNfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QzXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uCgpUaGUgdGhpcmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QzX2FkXzQ2WyJGMyIsICJGMiJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDNfYWRfNDZbIkYzIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kM19hZF80NlsiRjMiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDNfNDYsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QzXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIChTZWUgRmlndXJlIDksIFBhbmVsIEIsIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLikKCkluIHJlbGF0aW9uIHRvIHRoZSBfQk9EWV8tX0hFQVJUXy1fTUlORF8gc3RydWN0dXJlIGZvdW5kIGFtb25nIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMsIHdlIHdvdWxkIGRlc2NyaWJlIHRoaXMgdGhyZWUtZmFjdG9yIHN0cnVjdHVyZSBhcyBiZWluZyBzaW1pbGFyIHRvIHRoZSBhZHVsdC1saWtlIGNvbmNlcHR1YWwgc3RydWN0dXJl4oCUd2l0aCB0aGUgbm90YWJsZSBleGNlcHRpb24gdGhhdCBoYWxmIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoX2dldCBzYWRfLCBfaGF0ZSBzb21lb25lXywgYW5kIF9mZWVsIGhhcHB5XykgZGlkIG5vdCBsb2FkIG1vc3Qgc3Ryb25nbHkgb24gY2hpbGRyZW4ncyBvc3RlbnN0aXZlIF9IRUFSVFwqXyBmYWN0b3IuCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjR9CmZpZzA5X3Bsb3RzIDwtIHBsb3RfZ3JpZChlZmFfNF9wbG90X2QzXzQ2LCBlZmFfM19wbG90X2QzXzQ2LCBlZmFfM19wbG90X2QzX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDEsIDAuOCwgMSksIGxhYmVscyA9ICJBVVRPIikKZmlnMDlfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDlfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgOTogRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHJlc3VsdHMgZm9yIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gKEEtQiksIGFuZCBhZHVsdHMgKEMpIGluIFN0dWR5IDMsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgMTggbWVudGFsIGNhcGFjaXRpZXMgZm9yIGVhY2ggb2YgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIChhIGJlZXRsZSBhbmQgYSByb2JvdCkuIEZvciB5b3VuZ2VyIGNoaWxkcmVuLCB3ZSBpbmNsdWRlIGJvdGggdGhlIGZvdXItZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIChBKSBhbmQgdGhlIHRocmVlLWZhY3RvciBzb2x1dGlvbiBzdWdnZXN0ZWQgYnkgcGFyYWxsZWwgYW5hbHlzaXMgKEIpLiIsIDE5MCksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwOV93aXRoX2NhcHRpb24pCmBgYAoKIyMjIEF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZQoKT25lIG9mIHRoZSBnb2FscyBvZiBTdHVkeSAzIHdhcyB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgeW91bmcgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgdG8gdGhlIHR3byBzb2NpYWwgImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSB0aGUgZm9jdXMgb2YgU3R1ZHkgMSB3aXRoIG9sZGVyIGNoaWxkcmVuLiBIb3cgZG8gNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHRvIGFuIGF0eXBpY2FsIGFuaW1hbCAoYSBiZWV0bGUpIGFuZCBhbiBhdHlwaWNhbCBpbmFuaW1hdGUgb2JqZWN0IChhIHJvYm90KSB2YXJ5IGFjcm9zcyBlYXJseSBjaGlsZGhvb2QgKDQtNXkpLCBhbmQgaG93IGRvIHRoZXkgY29tcGFyZSB0byB0aGUgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBvZiBhZHVsdHM/CgojIyMjIENoaWxkcmVuIHZzLiBhZHVsdHMKCmBgYHtyfQpkM19hbGxfd2lkZV9pIDwtIGQzX2FkX3dpZGVfaSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBmdWxsX2pvaW4oZDNfNDZfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkX2NoYXIiKQpgYGAKCmBgYHtyfQplZmFfM19kM180Nl9wcm9qZWN0X3Njb3JlcyA8LSBwcmVkaWN0KG9iamVjdCA9IGVmYV8zX2QzX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkM180Nl93aWRlX2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmRhdGEgPSBkM19hZF93aWRlX2kpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLWMoc3ViaWQsIGNoYXJhY3Rlciwgc3ViaWRfY2hhcikpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIGFycmFuZ2Uoc3ViaWRfY2hhcikKYGBgCgpBcyBpbiBTdHVkaWVzIDEtMiwgd2Ugd2UgcHJvamVjdGVkIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGludG8gdGhlIGZhY3RvciBzcGFjZSBkZWZpbmVkIGJ5IGFkdWx0cyAoc3RhbmRhcmRpemVkIGluIHRlcm1zIG9mIGFkdWx0cycgcmVzcG9uc2VzKSwgYW5kIGV4YW1pbmVkIGZhY3RvciBzY29yZXMgYnkgYWdlIGdyb3VwICh1c2luZyB0aGUgbWV0aG9kIGFydGljdWxhdGVkIGJ5IHRlbiBCZXJnZSBldCBhbC4sIDE5OTkpLiBUaGlzIHlpZWxkZWQgdGhyZWUgc2NvcmVzIGZvciBlYWNoIHBhcnRpY2lwYW50LCBjb3JyZXNwb25kaW5nLCBpbiBwcmluY2lwbGUsIHRvIGhvbGlzdGljIGp1ZGdtZW50cyBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCwgcGh5c2lvbG9naWNhbCwgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlciB0aGUgcGFydGljaXBhbnQgZXZhbHVhdGVkLiAoTm90ZSB0aGF0IGVhY2ggb2YgdGhlc2UgdGhyZWUgc2NvcmVzIHRha2VzIGludG8gYWNjb3VudCBmYWN0b3IgbG9hZGluZ3MgZm9yIGFsbCAxOCBtZW50YWwgY2FwYWNpdGllcywgYXMgc2hvd24gaW4gRmlndXJlIDkuKSAKClRoaXMgYWxsb3dlZCB1cyB0byBleGFtaW5lIHRoZSBlZmZlY3RzIG9mIGFnZSBncm91cCAoYWR1bHQsIGNoaWxkKSwgY2hhcmFjdGVyIChiZWV0bGUsIHJvYm90KSwgYW5kIGZhY3RvciAoX0JPRFlfLCBfSEVBUlRfLCBfTUlORF8pIG9uIHRoZXNlIHNjb3JlcyB2aWEgbWl4ZWQgZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uLiBTZWUgVGFibGUgNSBmb3IgdGhlIHJlc3VsdHMgb2YgYSBtYXhpbWFsIG1vZGVsIGFuZCBGaWd1cmUgMTIgZm9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAsIGFnZSAoZm9yIGNoaWxkcmVuKSwgZmFjdG9yLCBhbmQgY2hhcmFjdGVyLiAKCmBgYHtyfQplZmFfM19zY29yZXNfZDNfYWxsIDwtIGVmYV8zX2QzX2FkJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF9jaGFyIikgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIC1zdWJpZF9jaGFyKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfYmVldGxlIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl9yb2JvdCIsICIiLCBzdWJpZCksCiAgICAgICAgIGNoYXJhY3RlciA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGFnZV9ncm91cCA9ICJhZHVsdHMiLAogICAgICAgICBmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZ1bGxfam9pbihlZmFfM19kM180Nl9wcm9qZWN0X3Njb3JlcyAlPiUgCiAgICAgICAgICAgICAgbGVmdF9qb2luKGQzXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlX2dyb3VwLCBhZ2UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImZhY3RvciIpLCBjaGFyYWN0ZXIsIGFnZV9ncm91cCksIGZ1bnMoZmFjdG9yKSkKCmVmYV8zX3Njb3Jlc19ib290X2QzX2FsbCA8LSBlZmFfM19zY29yZXNfZDNfYWxsICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgZmFjdG9yLCBmYWN0b3JfbmFtZSwgY2hhcmFjdGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QzX2FsbCRjaGFyYWN0ZXIpIDwtIGNiaW5kKCJSX0dNIiA9IGMoLTEsIDEpKQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QzX2FsbCRhZ2VfZ3JvdXApIDwtIGNiaW5kKCJDSDQ2X0FEIiA9IGMoMCwgMSkpCmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDNfYWxsJGZhY3Rvcl9uYW1lKSA8LSBjYmluZCgiSF9HTSIgPSBjKC0xLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoLTEsIDAsIDEpKQoKIyBlZmFfM19zY29yZXNfcl9kM19hbGwgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2VfZ3JvdXAgKiBjaGFyYWN0ZXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDF8c3ViaWQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kM19hbGwsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMTIzNDUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTkpKQojIHNhdmVSRFMoZWZhXzNfc2NvcmVzX3JfZDNfYWxsLCBmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDNfYWxsLnJkcyIpCgplZmFfM19zY29yZXNfcl9kM19hbGwgPC0gcmVhZFJEUygiLi9icm1zX21vZGVscy9lZmFfM19zY29yZXNfcl9kM19hbGwucmRzIikKIyBzdW1tYXJ5KGVmYV8zX3Njb3Jlc19yX2QzX2FsbCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIHJlc3VsdHMgPSAiYXNpcyJ9CmZpeGVmKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoUGFyYW1ldGVyLAogICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAogICAgImNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciAocm9ib3QgdnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEhFQVJUIiwKICAgICJmYWN0b3JfbmFtZU1fR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIE1JTkQiLAogICAgImFnZV9ncm91cENINDZfQUQiID0gImFnZSBncm91cCAoY2hpbGRyZW4gdnMuIGFkdWx0cykiLAogICAgImFnZV9ncm91cENINDZfQUQ6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINDZfQUQiID0gIkhFQVJUIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINDZfQUQiID0gIk1JTkQgw5cgYWdlIGdyb3VwIiwKICAgICJmYWN0b3JfbmFtZUhfR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgSEVBUlQgw5cgYWdlIGdyb3VwIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgTUlORCDDlyBhZ2UgZ3JvdXAiKSkgJT4lCiAgYXJyYW5nZShQYXJhbWV0ZXIpICU+JQogIG11dGF0ZShYID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+IDAsICIqIiwgIiIpKSAlPiUKICBtdXRhdGVfYXQodmFycygtUGFyYW1ldGVyLCAtWCksCiAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpICU+JQogIHJlbmFtZShiID0gRXN0aW1hdGUsIEVycm9yID0gRXN0LkVycm9yLCAiICIgPSBYKSAlPiUKICB1bml0ZShgOTUlIENJYCwgUTIuNSwgUTk3LjUsIHNlcCA9ICIsICIpICU+JQogIG11dGF0ZShgOTUlIENJYCA9IHBhc3RlMCgiWyIsIGA5NSUgQ0lgLCAiXSIpKSAlPiUKICBrbml0cjo6a2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoInIiLCAzKSksCiAgICAgICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgNTogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIHByZWRpY3RpbmcgZmFjdG9yIHNjb3JlcyBpbiBTdHVkeSAzIGJ5IGNoYXJhY3RlciAoYmVldGxlLCByb2JvdCksIGZhY3RvciAoQk9EWSwgSEVBUlQsIE1JTkQpLCBhbmQgYWdlIGdyb3VwIChhZHVsdHMsIGNoaWxkcmVuKS4gVGhlIG1vZGVsIHVzZWQgdGhlIGZvcm11bGEgJ2ZhY3RvciBzY29yZSB+IGZhY3RvciAqIGFnZSBncm91cCAqIGNoYXJhY3RlciArICgxIHwgc3ViamVjdCknIGFuZCB3YXMgaW1wbGVtZW50ZWQgaW4gdGhlICdicm1zJyBwYWNrYWdlIGZvciBSIChCw7xya25lciwgMjAxNykuIEZhY3RvciBhbmQgY2hhcmFjdGVyIHdlcmUgZWZmZWN0LWNvZGVkOyBhZ2UgZ3JvdXAgd2FzIGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZS4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJBZHVsdHMiLCAxLCA2KSAlPiUKICBncm91cF9yb3dzKCI0LTV5IHZzLiBhZHVsdHMiLCA3LCAxMikKYGBgCgpUaGUgcmVzdWx0cyBmb3IgYWR1bHRzIHdlcmUgaWRlbnRpY2FsIHRvIFN0dWR5IDE6IENvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMsIGZhY3RvciBzY29yZXMgc3VnZ2VzdCB0aGF0IGFkdWx0cyBnZW5lcmFsbHkgYXR0cmlidXRlZCBmZXdlciBtZW50YWwgY2FwYWNpdGllcyB0byB0aGUgcm9ib3QgdGhhbiB0aGUgYmVldGxlIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImNoYXJhY3RlclJfR00iKWApLiBIb3dldmVyLCB0aGlzIGFwcGVhcnMgdG8gYmUgZW50aXJlbHkgZHVlIHRvIHRoZSBodWdlIGRpc2NyZXBhbmN5IGJldHdlZW4gY2hhcmFjdGVycyBpbiB0aGUgX0JPRFlfIGRvbWFpbjsgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGFyYWN0ZXJzIHdhcyByZWR1Y2VkIHRvIG5lYXJseSBub3RoaW5nIGluIHRoZSBfSEVBUlRfIGRvbWFpbiAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kM19hbGwsICJmYWN0b3JfbmFtZUhfR006Y2hhcmFjdGVyUl9HTSIpYCksIGFuZCByZXZlcnNlZCBpbiB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJSX0dNIilgKS4gCgpMaWtld2lzZSwgdGhlIHBhdHRlcm4gb2YgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbidzIHJlc3BvbnNlcyBzdHJvbmdseSByZXNlbWJsZWQgdGhhdCBvZiA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGluIFN0dWR5IDE6IENoaWxkcmVuIHRlbmRlZCB0byBhdHRyaWJ1dGUgbW9yZSBtZW50YWwgY2FwYWNpdGllcywgY29sbGFwc2luZyBhY3Jvc3MgY2hhcmFjdGVycywgdGhhbiBkaWQgYWR1bHRzIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImFnZV9ncm91cENINDZfQUQiKWApIC0gYnV0IHRoaXMgd2FzIGRyaXZlbiBwcmltYXJpbHkgYnkgdGhlIHNvY2lhbC1lbW90aW9uYWwgZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKSwgYW5kIHdhcyByZXZlcnNlZCBpbiB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEIilgKS4gCgpJbiBhZGRpdGlvbiB0byB0aGVzZSBmaW5kaW5ncywgaG93ZXZlciwgd2UgYWxzbyBvYnNlcnZlZCB0aGF0LCBhcyBhIGdyb3VwLCA0LSB0byA1LXllYXItb2xkIGNoaWxkcmVuIHBlcmNlaXZlZCBsZXNzIG9mIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGJlZXRsZSB0aGFuIGRpZCBhZHVsdHMgKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDNfYWxsLCAiYWdlX2dyb3VwQ0g0Nl9BRDpjaGFyYWN0ZXJSX0dNIilgKSwgcGFydGl1Y2xhcmx5IGluIHRoZSBfTUlORF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QzX2FsbCwgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDQ2X0FEOmNoYXJhY3RlclJfR00iKWApLgoKYGBge3IsIGZpZy53aWR0aCA9IDIsIGZpZy5hc3AgPSAzfQpmaWcxMF9wbG90IDwtIGdncGxvdChlZmFfM19zY29yZXNfYm9vdF9kM19hbGwgJT4lCiAgICAgICAgIG11dGF0ZShhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIjQtNXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSksCiAgICAgICBhZXMoeCA9IGFnZV9ncm91cCwgeSA9IG1lYW4sIGNvbG9yID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZmFjdG9yX25hbWUpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNoYXJhY3RlciksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsIGJ5cm93ID0gVCwgcmV2ZXJzZSA9IEYpKSArCiAgbGFicyh4ID0gImFnZSBncm91cCIsIHkgPSAiIiwgY29sb3IgPSAiY2hhcmFjdGVyIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAzfQpmaWcxMF93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcxMF9wbG90LCBzdHJfd3JhcCgiRmlndXJlIDEwOiBGYWN0b3Igc2NvcmVzIGZvciBhZHVsdHMgYW5kIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgY2hhcmFjdGVyczogYSBiZWV0bGUgKHBpbmsgY2lyY2xlcykgb3IgYSByb2JvdCAoYmx1ZSBzcXVhcmVzKS4gRWFjaCBwYXJ0aWNpcGFudCByZWNpZXZlZCBhIGZhY3RvciBzY29yZSBmb3IgZWFjaCBmYWN0b3IgKEJPRFksIEhFQVJULCBhbmQgTUlORCwgYXMgZGVmaW5lZCBieSBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMpLiBXZSB0cmVhdGVkIHRoZXNlIHNjb3JlcyBhcyBzdW1tYXJpZXMgb2YgdGhhdCBwYXJ0aWNpcGFudHMnIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgaW4gdGhlc2UgZG9tYWluczsgYSBzY29yZSBvZiAwIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWFuIGZvciB0aGF0IGZhY3RvciBhbW9uZyBhZHVsdHMuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgdGhlIHktYXhpcyBkaWZmZXJzIGFjcm9zcyBwYW5lbHMuIiwgNjIpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnMTBfd2l0aF9jYXB0aW9uKQpgYGAKCkEgdmlzdWFsIGluc3BlY3Rpb24gb2YgRmlndXJlIDEwIGNsYXJpZmllcyB0aGVzZSBmaW5kaW5ncy4gQm90aCA0LSB0byA1LXllYXItb2xkIGNoaWxkcmVuIGFuZCBhZHVsdHMgbWFya2VkIGEgY2xlYXIgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGJlZXRsZSBpbiB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBfQk9EWV8gKHRvcCByb3cpLCBpbiBsaW5lIHdpdGggdGhlIGFuaW1hdGXigJNpbmFuaW1hdGUgZGlzdGluY3Rpb27igJRidXQgY2hpbGRyZW4sIGFzIGEgZ3JvdXAsIHVuZGVyLWF0dHJpYnV0ZWQgX0JPRFlfIGNhcGFjaXRpZXMgdG8gdGhlIGF0eXBpY2FsIGFuaW1hbCAodGhlIGJlZXRsZSkgYW5kIG92ZXItYXR0cmlidXRlZCBfQk9EWV8gY2FwYWNpdGllcyB0byB0aGUgYXR5cGljYWwgaW5hbmltYXRlIG9iamVjdCAodGhlIHJvYm90KS4gVGhpcyBwYXR0ZXJuIGFsaWducyB3aXRoIGZpbmRpbmdzIGluIGJvdGggU3R1ZHkgMSAod2l0aCBvbGRlciBjaGlsZHJlbikgYW5kIFN0dWR5IDIgKHdpdGggYm90aCBhZ2UgZ3JvdXBzIG9mIGNoaWxkcmVuLCBidXQgcGFydGljdWxhcmx5IDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4pLgoKTWVhbndoaWxlLCBib3RoIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyBjcmVkaXRlZCB0aGUgcm9ib3Qgd2l0aCBzbGlnaHRseSBncmVhdGVyIHBlcmNlcHR1YWwtY29nbml0aXZlIHNraWxscyAoX01JTkRfKSB0aGFuIHRoZSBiZWV0bGUgKGJvdHRvbSByb3cp4oCUYnV0IGNoaWxkcmVuIHBlcmNlaXZlZCB0aGlzIGRpZmZlcmVuY2UgdG8gYmUgc21hbGxlciBhbmQgZ2VuZXJhbGx5IHVuZGVyLWF0dHJpYnV0ZWQgX01JTkRfIGNhcGFjaXRpZXMgdG8gYm90aCB0YXJnZXQgY2hhcmFjdGVycy4gCgpGaW5hbGx5LCBpbiB0aGUgX0hFQVJUXyBkb21haW4gKG1pZGRsZSByb3cpIGJvdGggdGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90IHJlY2VpdmVkIHJhdGhlciBsb3cgc2NvcmVzIGFtb25nIGFkdWx0cywgYnV0IHZlcnkgaGlnaCBzY29yZXMgYW1vbmcgY2hpbGRyZW4uCgpTZWUgRmlndXJlIDExIGZvciByYXcgY291bnRzIG9mIF9ub18sIF9raW5kYV8sIGFuZCBfeWVzXyByZXNwb25zZXMgZm9yIGFsbCBpdGVtcywgZ3JvdXBlZCBieSBmYWN0b3IsIGNoYXJhY3RlciwgYW5kIGFnZSBncm91cCwgYW5kIHNlZSBTT00gZm9yIGFuIGFuYWx5c2lzLCBwYXJhbGxlbCB0byB0aGUgcmVncmVzc2lvbiBhbmFseXNlcyBoZXJlLCBvZiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgdG9wLWxvYWRpbmcgbWVudGFsIGNhcGFjaXRpZXMgZm9yIGVhY2ggZmFjdG9yIHRoYXQgd2VyZSBlbmRvcnNlZCBieSBwYXJ0aWNpcGFudHMgb2YgZGlmZmVyZW50IGFnZXMuCgpgYGB7cn0KZDNfYWxsIDwtIGQzX2FkICU+JQogIGZ1bGxfam9pbihkM180NikgJT4lCiAgc2VsZWN0KGFnZV9ncm91cCwgc3ViaWQsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlX251bSkgJT4lCiAgbGVmdF9qb2luKGxvYWRpbmdzX2Z1bihlZmFfM19kM19hZCkgJT4lIAogICAgICAgICAgICAgIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICB0b3BfbigxLCBsb2FkaW5nKSAlPiUKICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgYXJyYW5nZShmYWN0b3IsIGRlc2MobG9hZGluZykpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6MTgpICU+JQogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgZmFjdG9yLCBvcmRlcikpICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2VfbnVtKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gcmVjb2RlX2ZhY3RvcihyZXNwb25zZV9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuNSIgPSAia2luZGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gInllcyIpLAogICAgICAgICBmYWN0b3IgPSByZWNvZGVfZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMiIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMyIgPSAiTUlORCIpLAogICAgICAgICBhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW40NiIgPSAiY2hpbGRyZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJhZHVsdHMiKSkKYGBgCgpgYGB7cn0KZmlnMTFfZnVuIDwtIGZ1bmN0aW9uKHdoaWNoZmFjKXsKICBmaWcgPC0gZDNfYWxsICU+JQogICAgZmlsdGVyKGZhY3RvciA9PSB3aGljaGZhYykgJT4lCiAgICBtdXRhdGUoYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW4iID0gIjQtNXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIikpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjYXBhY2l0eSwgb3JkZXIpLAogICAgICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLCBhbHBoYSA9IHJlc3BvbnNlKSkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhjaGFyYWN0ZXIpLCByb3dzID0gdmFycyhhZ2VfZ3JvdXApLAogICAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICAgbGFicyh0aXRsZSA9IHdoaWNoZmFjLAogICAgICAgICB4ID0gIm1lbnRhbCBjYXBhY2l0eSAoYnkgZmFjdG9yKSIsCiAgICAgICAgIHkgPSAicHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMiKQogIAogIGlmKHdoaWNoZmFjICE9ICJNSU5EIil7CiAgICBmaWcgPC0gZmlnICsgZ3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArIGxhYnMoeCA9ICIiKQogIH0KICAKICByZXR1cm4oZmlnKQp9CgpmaWcxMV9CT0RZX3Bsb3QgPC0gZmlnMTFfZnVuKCJCT0RZIikKZmlnMTFfSEVBUlRfcGxvdCA8LSBmaWcxMV9mdW4oIkhFQVJUIikKZmlnMTFfTUlORF9wbG90IDwtIGZpZzExX2Z1bigiTUlORCIpCgpmaWcxMV9wbG90cyA8LSBwbG90X2dyaWQoZmlnMTFfQk9EWV9wbG90LCBmaWcxMV9IRUFSVF9wbG90LCBmaWcxMV9NSU5EX3Bsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMywgcmVsX2hlaWdodHMgPSBjKDEsIDEuMTEsIDEuMTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDN9CmZpZzExX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzExX3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDExOiBSYXcgY291bnRzIG9mIHJlc3BvbnNlcyBvZiAneWVzJyAoZGFyayksICdraW5kYScgKG1lZGl1bSksIG9yICdubycgKGxpZ2h0KSBmb3IgYWxsIG1lbnRhbCBjYXBhY2l0eSBpdGVtcywgZ3JvdXBlZCBieSB0aGUgZmFjdG9yIG9uIHdoaWNoIHRoZXkgbG9hZGluZyBtb3N0IHBvc2l0aXZlbHkgKEJPRFksIEhFQVJULCBNSU5EKSBhY2NvcmRpbmcgdG8gYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIG9mIGFkdWx0cycgcmVzcG9uc2VzIChTdHVkeSAxKS4gRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgY2hhcmFjdGVyczogYSBiZWV0bGUgKHBpbmspIG9yIGEgcm9ib3QgKGJsdWUpLiA0LSB0byA1LXllYXItb2xkIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGFuZCBhZHVsdHMnIHJlc3BvbnNlcyBhcmUgc2hvd24gc2VwYXJhdGVseS4iLCA5MiksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcxMV93aXRoX2NhcHRpb24pCmBgYAoKYGBge3J9CmQzX2FsbF9idWNrZXRzIDwtIGQzX2FsbCAlPiUKICBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSAlPiUKICBkaXN0aW5jdChmYWN0b3IsIGNhcGFjaXR5LCBvcmRlcikgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yKSAlPiUKICB0b3BfbigtNiwgb3JkZXIpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBvcmRlcikKCmQzX2FsbF9lbmRvcnNlIDwtIGQzX2FsbCAlPiUKICBmaWx0ZXIoY2FwYWNpdHkgJWluJSBkM19hbGxfYnVja2V0cyRjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKGVuZG9yc2UgPSBpZmVsc2UocmVzcG9uc2VfbnVtID4gMCwgMSwgMCkpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgc3ViaWQsIGNoYXJhY3RlciwgZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UocHJvcF9lbmRvcnNlID0gbWVhbihlbmRvcnNlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBuID0gbGVuZ3RoKGVuZG9yc2UpKSAlPiUKICB1bmdyb3VwKCkKCmQzX2FsbF9lbmRvcnNlX2Jvb3QgPC0gZDNfYWxsX2VuZG9yc2UgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAicHJvcF9lbmRvcnNlIikgJT4lCiAgdW5ncm91cCgpCgpkM19hbGxfZW5kb3JzZSA8LSBkM19hbGwgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yLCBzdWJpZCkgJT4lCiAgdG9wX24oLTYsIG9yZGVyKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGVuZG9yc2UgPSBpZmVsc2UocmVzcG9uc2VfbnVtID4gMCwgMSwgMCkpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgc3ViaWQsIGNoYXJhY3RlciwgZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UocHJvcF9lbmRvcnNlID0gbWVhbihlbmRvcnNlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBuID0gbGVuZ3RoKGVuZG9yc2UpKSAlPiUKICB1bmdyb3VwKCkKCmQzX2FsbF9lbmRvcnNlX2Jvb3QgPC0gZDNfYWxsX2VuZG9yc2UgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBjaGFyYWN0ZXIsIGZhY3RvcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAicHJvcF9lbmRvcnNlIikgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmZpZ1NVUFA1X3Bsb3QgPC0gZDNfYWxsX2VuZG9yc2UgJT4lCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW4iKSAlPiUKICBsZWZ0X2pvaW4oZDNfNDYgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IHByb3BfZW5kb3JzZSwgCiAgICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLCBjb2xvciA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCh+IGZhY3RvcikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC40LCB3aWR0aCA9IDAsIGhlaWdodCA9IDAuMDMpICsKICBiaW5vbWlhbF9zbW9vdGgoYWVzKHdlaWdodCA9IG4pLCBzaG93LmxlZ2VuZCA9IEYpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLAogICMgICAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZDNfYWxsX2VuZG9yc2UgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgYWVzKHggPSA2LjUpLCBhbHBoYSA9IDAuNCwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLmhlaWdodCA9IDAuMDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkM19hbGxfZW5kb3JzZV9ib290ICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSA2LjUsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ6NiwgNi41KSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUwKDQ6NiwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAxLzYpLCBsYWJlbHMgPSAwOjYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2ZiOWE5OSIsICIjMWY3OGI0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxLCAyMikpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAzKSkpICsKICBsYWJzKHkgPSAibnVtYmVyIG9mIGl0ZW1zIGVuZG9yc2VkIChvdXQgb2YgNikiKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZmlnU1VQUDVfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnU1VQUDVfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSBTVVBQNTogTnVtYmVyIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyAob3V0IG9mIDYpIGVuZG9yc2VkIGluIGVhY2ggZG9tYWluIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGJ5IDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gYW5kIGFkdWx0cyBpbiBTdHVkeSAzLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIDE4IG1lbnRhbCBjYXBhY2l0aWVzIGZvciB0d28gdGFyZ2V0IGNoYXJhY3RlcnM6IGEgYmVldGxlIChwaW5rIGNpcmNsZXMpIGFuZCBhIHJvYm90IChibHVlIHNxdWFyZXMpLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gTGluZXMgY29ycmVzcG9uZCB0byBsb2dpc3RpYyByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4iLCAxMzApLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnU1VQUDVfd2l0aF9jYXB0aW9uKQpgYGAKCiMjIyMgQWdlIGRpZmZlcmVuY2VzIHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlCgpPZiBjb3Vyc2UsIG91ciBzYW1wbGUgb2YgImNoaWxkcmVuIiBpbmNsdWRlZCBwYXJ0aWNpcGFudHMgYXMgeW91bmcgYXMgNyB5ZWFycyBhbmQgdXAgdG8gbmVhcmx5IDEwIHllYXJzIG9mIGFnZS4gSG93IGRpZCBhdHRyaWJ1dGlvbnMgdmFyeSBhY3Jvc3MgdGhpcyBhZ2UgcmFuZ2U/IAoKYGBge3J9CmQzX2NoX2FnZSA8LSBkM180NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkKYGBgCgpgYGB7cn0KIyBjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QzX2FsbCRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkhfR00iID0gYygtMSwgMSwgMCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoLTEsIDAsIDEpKQojIAojICMgYWRkIG9yZGVyIGVmZmVjdHM/PwojIGVmYV8zX3Njb3Jlc19yX2QzXzQ2IDwtIGJybShzY29yZSB+IGZhY3Rvcl9uYW1lICogYWdlICogY2hhcmFjdGVyCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDEgKyBjaGFyYWN0ZXJ8c3ViaWQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZWZhXzNfc2NvcmVzX2QzX2FsbCAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJjaGlsZHJlbjQ2IiwgIWlzLm5hKGFnZSkpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMTIzNDUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gNCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5KSkKIyBzYXZlUkRTKGVmYV8zX3Njb3Jlc19yX2QzXzQ2LCBmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDNfNDYucmRzIikKCmVmYV8zX3Njb3Jlc19yX2QzXzQ2IDwtIHJlYWRSRFMoIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDNfNDYucmRzIikKIyBzdW1tYXJ5KGVmYV8zX3Njb3Jlc19yX2QzXzQ2KQpgYGAKClRvIGV4cGxvcmUgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZXMgY29udGludW91c2x5IHdpdGhpbiB0aGUgY2hpbGQgc2FtcGxlLCB3ZSBjb25kdWN0ZWQgYW4gYWRkaXRpb25hbCByZWdyZXNzaW9uIGFuYWx5c2lzIG9uIGNoaWxkcmVuJ3MgZmFjdG9yIHNjb3JlcyBhbG9uZSwgaW5jbHVkaW5nIGludGVyYWN0aW9ucyB3aXRoIGV4YWN0IGFnZSBpbiB5ZWFycyAoY2VudGVyZWQgYXQgdGhlIG1lYW46IGByIGZvcm1hdChyb3VuZChtZWFuKGQzX2NoX2FnZSRhZ2UsIG5hLnJtID0gVCksIDIpLCBuc21hbGwgPSAyKWB5KSByYXRoZXIgdGhhbiBhZ2UgZ3JvdXAuIEluIGxpbmUgd2l0aCB0aGUgYWdlIGdyb3VwIGFuYWx5c2lzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhpcyBjb25maXJtZWQgdGhhdCwgcmVsYXRpdmUgdG8gdGhlIGdyYW5kIG1lYW4sIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIGRlY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kM180NiwgImZhY3Rvcl9uYW1lSF9HTTphZ2UiKWApIGFuZCBhdHRyaWJ1dGlvbnMgb2YgX01JTkRfIGluY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kM180NiwgImZhY3Rvcl9uYW1lTV9HTTphZ2UiKWApLiAoU2VlIFRhYmxlIDYgZm9yIHRoZSBmdWxsIHJlc3VsdHMgb2YgdGhpcyBtb2RlbC4pCgpgYGB7ciwgaW5jbHVkZSA9IFQsIHJlc3VsdHMgPSAiYXNpcyJ9CmZpeGVmKGVmYV8zX3Njb3Jlc19yX2QzXzQ2KSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKICBtdXRhdGUoUGFyYW1ldGVyID0gcmVjb2RlX2ZhY3RvcihQYXJhbWV0ZXIsCiAgICAiSW50ZXJjZXB0IiA9ICIoSW50ZXJjZXB0KSIsCiAgICAiY2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIChyb2JvdCB2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTSIgPSAiSEVBUlQgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgSEVBUlQiLAogICAgImZhY3Rvcl9uYW1lTV9HTTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgTUlORCIsCiAgICAiYWdlIiA9ICJhZ2UgKG1lYW4tY2VudGVyZWQpIiwKICAgICJhZ2U6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZSIgPSAiSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlIiA9ICJNSU5EIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIMOXIGFnZSIpKSAlPiUKICBhcnJhbmdlKFBhcmFtZXRlcikgJT4lCiAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQogIHVuaXRlKGA5NSUgQ0lgLCBRMi41LCBROTcuNSwgc2VwID0gIiwgIikgJT4lCiAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA2OiBGaXhlZCBlZmZlY3RzIGZyb20gYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gbW9kZWwgb2YgY2hpbGRyZW4ncyByZXNwb25zZXMsIHByZWRpY3RpbmcgZmFjdG9yIHNjb3JlcyBpbiBTdHVkeSAxIGJ5IGNoYXJhY3RlciAoYmVldGxlLCByb2JvdCksIGZhY3RvciAoQk9EWSwgSEVBUlQsIE1JTkQpLCBhbmQgZXhhY3QgYWdlLiBUaGUgbW9kZWwgdXNlZCB0aGUgZm9ybXVsYSAnZmFjdG9yIHNjb3JlIH4gZmFjdG9yICogYWdlICogY2hhcmFjdGVyICsgKDEgKyBjaGFyYWN0ZXIgfCBzdWJqZWN0KScgYW5kIHdhcyBpbXBsZW1lbnRlZCBpbiB0aGUgJ2JybXMnIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gRmFjdG9yIGFuZCBjaGFyYWN0ZXIgd2VyZSBlZmZlY3QtY29kZWQsIGFuZCBhZ2Ugd2FzIG1lYW4tY2VudGVyZWQuIEFzdGVyaXNrcyBtYXJrIHBhcmFtZXRlcnMgd2hvc2UgOTUlIGNyZWRpYmxlIGludGVydmFsIGRvZXMgbm90IGluY2x1ZGUgMC4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQ29sbGFwc2luZyBhY3Jvc3MgYWdlIiwgMSwgNikgJT4lCiAgZ3JvdXBfcm93cygiQWdlIGVmZmVjdHMiLCA3LCAxMikKYGBgCgpgYGB7cn0KZmlnMTJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2QzX2FsbCAlPiUgZmlsdGVyKCFpcy5uYShhZ2UpKSwKICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2UsIHkgPSBzY29yZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yX25hbWUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjI1LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBlZmFfM19zY29yZXNfZDNfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gNi41KSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLjI1KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZWZhXzNfc2NvcmVzX2Jvb3RfZDNfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSA2LjUsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMS4yNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ6NiwgNi41KSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUwKDQ6NiwgInkiKSwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEwLCAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjZmI5YTk5IiwgIiMxZjc4YjQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNmYjlhOTkiLCAiIzFmNzhiNCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMjEsIDIyKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgc2l6ZSA9IDMpKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjV9CmZpZzEyX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzEyX3Bsb3QsIHN0cl93cmFwKCJGaWd1cmUgMTI6IEZhY3RvciBzY29yZXMgZm9yIGFkdWx0cyBhbmQgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAzLCByZXBsb3R0ZWQgdG8gaWxsdXN0cmF0ZSBhZ2UgZWZmZWN0cyB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZS4gTGluZXMgY29ycmVzcG9uZCB0byBsaW5lYXIgcmVncmVzc2lvbnMgY29uc2lkZXJpbmcgY2hpbGRyZW4ncyBzY29yZXMgYWxvbmUuIEVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb24gYWR1bHRzJyBzY29yZXMuIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgdGhlIHktYXhpcyBkaWZmZXJzIGFjcm9zcyBwYW5lbHMuIiwgMTM1KSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzEyX3dpdGhfY2FwdGlvbikKYGBgCgpgYGB7cn0KIyBjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QzX2FsbCRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkJfR00iID0gYygxLCAtMSwgMCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoMCwgLTEsIDEpKQojICMgYWRkIG9yZGVyIGVmZmVjdHM/PwojIGVmYV8zX3Njb3Jlc19yX2QzXzQ2djIgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2UgKiBjaGFyYWN0ZXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSArIGNoYXJhY3RlciB8IHN1YmlkKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kM19hbGwgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiY2hpbGRyZW40NiIsICFpcy5uYShhZ2UpKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEyMzQ1LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSkpCiMgc2F2ZVJEUyhlZmFfM19zY29yZXNfcl9kM180NnYyLCBmaWxlID0gIi4vYnJtc19tb2RlbHMvZWZhXzNfc2NvcmVzX3JfZDNfNDZ2Mi5yZHMiKQoKZWZhXzNfc2NvcmVzX3JfZDNfNDZ2MiA8LSByZWFkUkRTKCIuL2JybXNfbW9kZWxzL2VmYV8zX3Njb3Jlc19yX2QzXzQ2djIucmRzIikKIyBzdW1tYXJ5KGVmYV8zX3Njb3Jlc19yX2QzXzQ2djIpCmBgYAoKYGBge3J9CmNvbnRyYXN0cyhlZmFfM19zY29yZXNfZDNfYWxsJGZhY3Rvcl9uYW1lKSA8LSBjYmluZCgiSF9HTSIgPSBjKC0xLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNX0dNIiA9IGMoLTEsIDAsIDEpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgcmVzdWx0cyA9ICJhc2lzIn0KZml4ZWYoZWZhXzNfc2NvcmVzX3JfZDNfNDZ2MikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoUGFyYW1ldGVyLAogICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAogICAgImNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciAocm9ib3QgdnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUJfR00iID0gIkJPRFkgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lQl9HTTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgQk9EWSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIiwKICAgICJhZ2UiID0gImFnZSAobWVhbi1jZW50ZXJlZCkiLAogICAgImFnZTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZUJfR006YWdlIiA9ICJCT0RZIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZSIgPSAiTUlORCDDlyBhZ2UiLAogICAgImZhY3Rvcl9uYW1lQl9HTTphZ2U6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEJPRFkgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIMOXIGFnZSIpKSAlPiUKICBhcnJhbmdlKFBhcmFtZXRlcikgJT4lCiAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQogIHVuaXRlKGA5NSUgQ0lgLCBRMi41LCBROTcuNSwgc2VwID0gIiwgIikgJT4lCiAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSBTVVBQWDogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIG9mIGNoaWxkcmVuJ3MgcmVzcG9uc2VzLCBwcmVkaWN0aW5nIGZhY3RvciBzY29yZXMgaW4gU3R1ZHkgMSBieSBjaGFyYWN0ZXIgKGJlZXRsZSwgcm9ib3QpLCBmYWN0b3IgKEJPRFksIEhFQVJULCBNSU5EIC0gcmVjb2RlZCB3aXRoIEhFQVJUIGFzIHRoZSBiYXNlbGluZSksIGFuZCBleGFjdCBhZ2UuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgKiBjaGFyYWN0ZXIgKyAoMSArIGNoYXJhY3RlciB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBGYWN0b3IgYW5kIGNoYXJhY3RlciB3ZXJlIGVmZmVjdC1jb2RlZCwgYW5kIGFnZSB3YXMgbWVhbi1jZW50ZXJlZC4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJDb2xsYXBzaW5nIGFjcm9zcyBhZ2UiLCAxLCA2KSAlPiUKICBncm91cF9yb3dzKCJBZ2UgZWZmZWN0cyIsIDcsIDEyKQpgYGAKCioqQk9PS01BUkssIFJFVFVSTiBXSEVOIFNBTVBMRSBJUyBDT01QTEVURToqKiBXZSBvYnNlcnZlZCBubyBzdWJzdGFudGlhbCBhZ2UgZWZmZWN0cyB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZS4gSG93ZXZlciwgdmlzdWFsIGluc3BlY3Rpb24gb2YgRmlndXJlIDEyIHN1Z2dlc3RzIHRoYXQsIHdpdGggYWdlLCBjaGlsZHJlbiBkaXN0aW5ndWlzaGVkIG1vcmUgc2hhcnBseSBiZXR3ZWVuIHRoZSBiZWV0bGUgYW5kIHRoZSByb2JvdCBpbiB0aGUgX0JPRFlfIGRvbWFpbiAobGVmdCkuIEJlY2F1c2UgYSBjb21wYXJpc29uIGJldHdlZW4gX0JPRFlfIGFuZCB0aGUgZ3JhbmQgbWVhbiB3YXMgbm90IGluY2x1ZGVkIGluIG91ciBjb2Rpbmcgc2NoZW1lIGZvciBmYWN0b3IsIGFuZCBiZWNhdXNlIHRoaXMgcGFydGljdWxhciBlZmZlY3QgdGFrZXMgdGhlIGZvcm0gb2YgaW5jcmVhc2luZyBhdHRyaWJ1dGlvbnMgdG8gdGhlIGJlZXRsZSBhbmQgZGVjcmVhc2luZyBhdHRyaWJ1dGlvbnMgdG8gdGhlIHJvYm90LCBvdXIgYW5hbHlzaXMgbWF5IG5vdCBoYXZlIHBpY2tlZCB0aGlzIHVwLiBUbyBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIsIHdlIHJlLXJhbiB0aGUgYW5hbHlzaXMgc3dhcHBpbmcgYSBjb21wYXJpc29uIGJldHdlZW4gX0JPRFlfIGFuZCB0aGUgZ3JhbmQgbWVhbiBpbiBmb3IgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBfSEVBUlRfIGFuZCB0aGUgZ3JhbmQgbWVhbiwgYnV0IHRoaXMgc3RpbGwgeWllbGRlZCBubyBzdWJzdGFudGlhbCBhZ2UgZWZmZWN0cyAoc2VlIFNPTSkuCgojIyBEaXNjdXNzaW9uCgpXZSBoYWQgdHdvIGdvYWxzIGluIFN0dWR5IDM6ICgxKSBUbyB0ZXN0IHdoZXRoZXIgdGhlIGRpZmZlcmVuY2VzIGluIGNvbmNlcHR1YWwgc3RydWN0dXJlIGJldHdlZW4gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBhbmQgb2xkZXIgY2hpbGRyZW4gYWR1bHRzLCBhcyByZXZlYWxlZCBieSBTdHVkeSAyLCB3b3VsZCBlbWVyZ2UgaW4gYSBzdHVkeSBjYXJlZnVsbHkgdGFpbG9yZWQgdG8gYmUgYWdlLWFwcHJvcHJpYXRlIGZvciB5b3VuZyBwcmVzY2hvb2wgY2hpbGRyZW47IGFuZCAoMikgVG8gZXhwbG9yZSB5b3VuZyBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyB0byB0aGUgc29jaWFsICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgdGhlIGZvY3VzIG9mIFN0dWR5IDEgd2l0aCBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBhbmQgd2hpY2ggc2VlbWVkIHRvIGVsaWNpdCBwYXJ0aWN1bGFybHkgdW4tYWR1bHQtbGlrZSByZXNwb25zZXMgZnJvbSB0aGUgc21hbGwgc3Vic2V0IG9mIGNoaWxkcmVuIHdobyBhc3Nlc3NlZCB0aGVzZSBjaGFyYWN0ZXJzIGluIFN0dWR5IDIuCgojIyMgVGhlIF9CT0RZXy1fSEVBUlRfLV9NSU5EXyBmcmFtZXdvcmsgaXMgbmFzY2VudCwgYnV0IG5vdCByb2J1c3QsIGFtb25nIHByZXNjaG9vbC1hZ2UgY2hpbGRyZW4KClJlZ2FyZGluZyBvdXIgZmlyc3QgZ29hbCwgU3R1ZHkgMyBwcm92aWRlcyBmdXJ0aGVyIGV2aWRlbmNlIHRoYXQgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHVuZGVybHlpbmcgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyB1bmRlcmdvZXMgc3Vic3RhbnRpYWwgY2hhbmdlcyBiZXR3ZWVuIGVhcmx5IGFuZCBtaWRkbGUgY2hpbGRob29kLiBVc2luZyBhIHBhcmFkaWdtIHRoYXQgd2FzIGJldHRlciB0YWlsb3JlZCBmb3IgdGhpcyBhZ2UgZ3JvdXAgYW5kIHRoYXQgZmVhdHVyZWQgdm9jYWJ1bGFyeSBpdGVtcyBleHByZXNzbHkgZGVzaWduZWQgdG8gcGljayBvdXQgKGFkdWx0KSBub3Rpb25zIG9mIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBpbiBhIGJhbGFuY2VkIHdheSAoNiBpdGVtcyBwZXIgZmFjdG9yKSwgU3R1ZHkgMyBkaWQgcHJvdmlkZSBzb21lIGluZGljYXRpb25zIHRoYXQgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBtYXkgYmUgbW9yZSBtYXR1cmUgaW4gdGhlIGVhcmx5IHByZXNjaG9vbCB5ZWFycyB0aGFuIFN0dWR5IDIgd291bGQgc3VnZ2VzdC4gSG93ZXZlciwgZXZlbiBpbiB0aGlzIG1vZGlmaWVkIHBhcmFkaWdtLCB3ZSBvYnNlcnZlZCBzZXZlcmFsIGluZGljYXRpb25zIHRoYXQgdGhpcyB0aHJlZS1wYXJ0IGNvbmNlcHR1YWwgc3RydWN0dXJlIGlzIG5vdCBmdWxseSBpbiBwbGFjZSBieSA0LTV5LgoKYGBge3J9CmVmYV8zX2QzXzQ2X21vZGxvYWQgPC0gbG9hZGluZ3NfZnVuKGVmYV8zX2QzXzQ2LCAibG9uZyIpICU+JSAKICBmaWx0ZXIobG9hZGluZyA+PSAwLjMwKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkgJT4lCiAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogIG11dGF0ZShhZHVsdF9mYWN0b3IgPSBjYXNlX3doZW4oCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QzX2FkLCAxOCwgIkYxIiwgInBvcyIpKSA9PSBUIH4gIkJPRFkiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kM19hZCwgMTgsICJGMiIsICJwb3MiKSkgPT0gVCB+ICJIRUFSVCIsCiAgICBncmVwbChjYXBhY2l0eSwgdG9wX25fZG9tQ2FwKGVmYV8zX2QzX2FkLCAxOCwgIkYzIiwgInBvcyIpKSA9PSBUIH4gIk1JTkQiLAogICAgVFJVRSB+ICJubyBkb21pbmFudCBmYWN0b3IiKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKRmlyc3QsIHRoZSBzaW1pbGFyaXRpZXMuIEFzIHdpdGggdGhlIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gU3R1ZHkgMiwgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbuKAmXMgcmVzcG9uc2VzIGluIFN0dWR5IDMgd2VyZSBjaGFyYWN0ZXJpemVkIGJ5IHN0cm9uZyBjb3JyZWxhdGlvbnMgYW1vbmcgYSBzdWl0ZSBvZiBwZXJjZXB0dWFsIGFuZCAocGFydGljdWxhcmx5KSBjb2duaXRpdmUgY2FwYWNpdGllcyB0aGF0IHdlIGhhdmUgbGFiZWxlZCBfTUlORF8uIFRoaXMgc3VpdGUgb2YgX01JTkRfIGFiaWxpdGllcyB3YXMgcm9idXN0IHRvIGFuYWx5c2lzIGNob2ljZXMgYW5kIGVtZXJnZWQgY2xlYXJseSBpbiBib3RoIFN0dWRpZXMgMiBhbmQgMywgYm9sc3RlcmluZyBvdXIgZWFybGllciBjbGFpbSB0aGF0IHRoaXMgaXMgb25lIGFzcGVjdCBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSB0aGF0IG1heSBiZSByZWxhdGl2ZWx5IHN0YWJsZSBmcm9tIGVhcmx5IGluIGNoaWxkaG9vZC4gCgpNb3JlIGJyb2FkbHksIGluIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzIChGaWd1cmUgOSwgUGFuZWwgQiksIHdlIHNlZSByZWNvZ25pemFibGUgX0JPRFlfIGFuZCBfTUlORF8gZmFjdG9ycyBhcyB3ZWxsIGFzIGEgbmFzY2VudCBfSEVBUlRcKl8gZmFjdG9yLCBvbiB3aGljaCBtb3N0IG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGl0ZW1zIGxvYWRlZCBtb2RlcmF0ZWx5IHN0cm9uZ2x5IChsb2FkaW5ncyAkXGdlcSQgMC4zMDogYHIgaXRhbF9ieV9jYXBfZnVuKGVmYV8zX2QzXzQ2X21vZGxvYWQkY2FwYWNpdHlbZWZhXzNfZDNfNDZfbW9kbG9hZCRhZHVsdF9mYWN0b3IgPT0gIkhFQVJUIiAmIGVmYV8zX2QzXzQ2X21vZGxvYWQkZmFjdG9yID09ICJGMyJdKWApLiBUaGlzIGlzIGEgc3Vic3RhbnRpYWxseSBtb3JlIGFkdWx0LWxpa2UgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdGhhbiB3ZSBvYnNlcnZlZCBhbW9uZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDIuCgpgYGB7cn0KZWZhXzNfZDNfNDZfbG93bG9hZCA8LSBsb2FkaW5nc19mdW4oZWZhXzNfZDNfNDYsICJsb25nIikgJT4lIAogIGZpbHRlcihsb2FkaW5nIDwgMC4zMCkgJT4lCiAgYXJyYW5nZShmYWN0b3IsIGRlc2MobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICBtdXRhdGUoYWR1bHRfZmFjdG9yID0gY2FzZV93aGVuKAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kM19hZCwgMTgsICJGMSIsICJwb3MiKSkgPT0gVCB+ICJCT0RZIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDNfYWQsIDE4LCAiRjIiLCAicG9zIikpID09IFQgfiAiSEVBUlQiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kM19hZCwgMTgsICJGMyIsICJwb3MiKSkgPT0gVCB+ICJNSU5EIiwKICAgIFRSVUUgfiAibm8gZG9taW5hbnQgZmFjdG9yIikpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQplZmFfM19kM180Nl9kb21DYXAgPC0gbG9hZGluZ3NfZnVuKGVmYV8zX2QzXzQ2LCAibG9uZyIpICU+JSAKICBhcnJhbmdlKGRlc2MobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoYWR1bHRfZmFjdG9yID0gY2FzZV93aGVuKAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kM19hZCwgMTgsICJGMSIsICJwb3MiKSkgPT0gVCB+ICJCT0RZIiwKICAgIGdyZXBsKGNhcGFjaXR5LCB0b3Bfbl9kb21DYXAoZWZhXzNfZDNfYWQsIDE4LCAiRjIiLCAicG9zIikpID09IFQgfiAiSEVBUlQiLAogICAgZ3JlcGwoY2FwYWNpdHksIHRvcF9uX2RvbUNhcChlZmFfM19kM19hZCwgMTgsICJGMyIsICJwb3MiKSkgPT0gVCB+ICJNSU5EIiwKICAgIFRSVUUgfiAibm8gZG9taW5hbnQgZmFjdG9yIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nKSkKYGBgCgpIb3dldmVyLCBhcyBpbiBTdHVkeSAyLCB0aGUgdmVyeSBmYWN0IHRoYXQgZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gZmFjdG9yIHJldGVudGlvbiB5aWVsZGVkIGRpZmZlcmVudCByZXN1bHRzIGlzIGZ1cnRoZXIgZXZpZGVuY2UgdGhhdCwgYWx0aG91Z2ggd2Ugb2JzZXJ2ZWQgc29tZSBldmlkZW5jZSBmb3IgYSBuYXNjZW50IF9CT0RZXy1fSEVBUlRfLV9NSU5EXyBmcmFtZXdvcmsgYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiwgdGhpcyBmcmFtZXdvcmsgd2FzIG5vdCByb2J1c3QgYW1vbmcgcHJlc2Nob29sLWFnZSBjaGlsZHJlbi4gCgpUaGlzIGFwcGVhcnMgdG8gYmUgcGFydGljdWxhcmx5IHRydWUgd2l0aCByZWdhcmQgdG8gdGhlaXIgdW5kZXJzdGFuZGluZyBvZiBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoX0hFQVJUXykuIEVjaG9pbmcgdGhlIHJlc3VsdHMgb2YgU3R1ZHkgMiwgY2hpbGRyZW7igJlzIHJlc3BvbnNlcyBzdWdnZXN0IHRoYXQgdGhleSBtYXkgbm90IGNvbnNpZGVyIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0aGF0IGNvbnN0aXR1dGUgd2hhdCB3ZSBoYXZlIGNhbGxlZCBfSEVBUlRfIGFtb25nIGFkdWx0cyB0byBoYW5nIHRvZ2V0aGVyIGFzIG9uZSwgY2xlYXJseSBkaXN0aW5jdCBjb21wb25lbnQgb2YgbWVudGFsIGxpZmUuIEV2ZW4gaW4gdGhlIG1vcmUgYWR1bHQtbGlrZSwgdGhyZWUtZmFjdG9yIHNvbHV0aW9uIChGaWd1cmUgOSwgUGFuZWwgQiksIHR3byBvZiB0aGUgc2l4IHNvY2lhbC1lbW90aW9uYWwgaXRlbXMgZGlkIF9ub3RfIGxvYWRpbmcgc3Ryb25nbHkgb24gdGhlIG9zdGVuc2l2ZSBfSEVBUlRcKl8gZmFjdG9yIChsb2FkaW5ncyAkXGxlcSQgMC4zMDogYHIgaXRhbF9ieV9jYXBfZnVuKGVmYV8zX2QzXzQ2X2xvd2xvYWQkY2FwYWNpdHlbZWZhXzNfZDNfNDZfbG93bG9hZCRhZHVsdF9mYWN0b3IgPT0gIkhFQVJUIiAmIGVmYV8zX2QzXzQ2X2xvd2xvYWQkZmFjdG9yID09ICJGMyJdKWApOyBhbmQgZm91ciBvZiB0aGUgc2l4IHNvY2lhbC1lbW90aW9uYWwgaXRlbXMgbG9hZGVkIG1vZGVyYXRlbHkgc3Ryb25nbHkgb24gdGhlIF9NSU5EXyBmYWN0b3IgKGxvYWRpbmdzICRcZ2VxJCAwLjMwOiBgciBpdGFsX2J5X2NhcF9mdW4oZWZhXzNfZDNfNDZfbW9kbG9hZCRjYXBhY2l0eVtlZmFfM19kM180Nl9tb2Rsb2FkJGFkdWx0X2ZhY3RvciA9PSAiSEVBUlQiICYgZWZhXzNfZDNfNDZfbW9kbG9hZCRmYWN0b3IgPT0gIkYyIl0pYCkuIEluZGVlZCwgX01JTkRfIHdhcyB0aGUgX2RvbWluYW50XyBmYWN0b3IgZm9yIHR3byBzb2NpYWwtZW1vdGlvbmFsIGl0ZW1zIGluIHRoaXMgdGhyZWUtZmFjdG9yIHNvbHV0aW9uIChgciBpdGFsX2J5X2NhcF9mdW4oZWZhXzNfZDNfNDZfZG9tQ2FwJGNhcGFjaXR5W2VmYV8zX2QzXzQ2X2RvbUNhcCRmYWN0b3IgPT0gIkYyIiAmIGVmYV8zX2QzXzQ2X2RvbUNhcCRhZHVsdF9mYWN0b3IgPT0gIkhFQVJUIl0pYCkuIE5vbmUgb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIHdlcmUgdHJ1ZSBhbW9uZyBhZHVsdHMgKEZpZ3VyZSA5LCBQYW5lbCBDKS4KCiMjIyBMaWtlIG9sZGVyIGNoaWxkcmVuLCBwcmVzY2hvb2wtYWdlIGNoaWxkcmVuIG92ZXItYXR0cmlidXRlIF9IRUFSVF8gYW5kIHVuZGVyLWF0dHJpdXRlIF9NSU5EXyB0byBzb2NpYWwgImVkZ2UgY2FzZXMiCgpSZWdhcmRpbmcgb3VyIHNlY29uZCBnb2FsLCBTdHVkeSAzIHJldmVhbGVkIHNpbWlsYXIgcGF0dGVybiBvZiBhZ2UtcmVsYXRlZCBjaGFuZ2VzIGluIGNoaWxkcmVu4oCZcyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIHRvIHRoZSBwcmV2aW91cyBzdHVkaWVzLgoKSW4gdGhlIF9CT0RZXyBkb21haW4sIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBhbmltYXRlIGFuZCBpbmFuaW1hdGUgdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIHByZXNlbnQgZXZlbiBhbW9uZyB0aGUgeW91bmdlc3QgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSwgYnV0IGFwcGVhcmVkICh1cG9uIHZpc3VhbCBpbnNwZWN0aW9uIG9mIEZpZ3VyZSAxMikgdG8gaW5jcmVhc2UgYWNyb3NzIHRoZSA0LTV5IGFnZSByYW5nZSwgbmV2ZXIgcXVpdGUgcmVhY2hpbmcgdGhlIGRlZ3JlZSBvZiBzZXBhcmF0aW9uIHByZXNlbnQgYW1vbmcgYWR1bHRzIChub3RlIGFsc28gdGhhdCBubyB3aXRoaW4tc2FtcGxlIGFnZSBlZmZlY3RzIHdlcmUgYm9ybiBvdXQgYnkgb3VyIHJlZ3Jlc3Npb24gYW5hbHlzZXM7IFRhYmxlIDYpLiBUaGlzIGVjaG9lcyB0aGUgZ2VuZXJhbCByZXN1bHRzIG9mIFN0dWR5IDLigJRhcyB3ZWxsIGFzIHRoZSBzcGVjaWZpYyBvYnNlcnZhdGlvbiB0aGF0IDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4ncyBfQk9EWV8gYXR0cmlidXRpb25zIGRpdmVyZ2VkIGZyb20gYWR1bHRzIHByaW1hcmlseSBpbiB0aGVpciBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgYW5kIHRoZSBiZWV0bGUuIChBcyB3ZSBkaXNjdXNzZWQgZWFybGllciwgc2ltaWxhciwgc3VidGxlciBwYXR0ZXJucyB3ZXJlIHByZXNlbnQgZXZlbiBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDEuKSBUaGVzZSB0aHJlZSBzdHVkaWVzIHRha2VuIHRvZ2V0aGVyIGJvbHN0ZXIgb3VyIGNsYWltIHRoYXQsIHdoaWxlIGJ5IHRoZSBwcmVzY2hvb2wgeWVhcnMgY2hpbGRyZW4gYXJlIHJlbGF0aXZlbHkgZmFyIGFsb25nIGluIHRoZWlyIG1hc3Rlcnkgb2Ygd2hpY2ggZW50aXRpZXMgaW4gdGhlIHdvcmxkIGFyZSBzdWJqZWN0IHRvIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIEJPRFksIHRoZXkgY29udGludWUgdG8gcmVmaW5lIHRoZWlyIGFwcGxpY2F0aW9uIG9mIHRoaXMgY29uY2VwdCB0aHJvdWdob3V0IGVhcmx5IGNoaWxkaG9vZCAoYW5kIHBlcmhhcHMgYmV5b25kKS4KCkluIHRoZSBfSEVBUlRfIGRvbWFpbiwgd2UgYWdhaW4gc2VlIGRldmVsb3BtZW50YWwgdHJlbmRzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJldmlvdXMgc3R1ZGllcy4gQXMgd2l0aCBib3RoIG9sZGVyIGFuZCBlc3BlY2lhbGx5IHlvdW5nZXIgY2hpbGRyZW4gaW4gU3R1ZGllcyAxLTIsIGluIFN0dWR5IDMgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiBhdHRyaWJ1dGVkIG11Y2ggbW9yZSBpbiB0aGUgd2F5IG9mIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHRvIGJvdGggYSBiZWV0bGUgYW5kIGEgcm9ib3QgdGhhbiBkaWQgYWR1bHRzLiBBcyBpbiBTdHVkeSAyLCB3ZSBvYnNlcnZlZCBubyBldmlkZW5jZSBmb3IgdGhpcyB0ZW5kZW5jeSB0byBkZWNsaW5lIHdpdGggYWdlIHdpdGhpbiB0aGlzIHNhbXBsZS4KCkZpbmFsbHksIGluIHRoZSBfTUlORF8gZG9tYWluLCA0LSB0byA1LXllYXItb2xkIGNoaWxkcmVuIGF0dHJpYnV0ZWQgbXVjaCBsZXNzIGluIHRoZSB3YXkgb2YgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIHRvIGJvdGggYSBiZWV0bGUgYW5kIGEgcm9ib3QgdGhhbiBkaWQgYWR1bHRzLCBlaGNvaW5nIHByZXZpb3VzIGZpbmRpbmdzIGFtb25nIDQtIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZGllcyAxLTIuIFZpc3VhbCBpbnNwZWN0aW9uIG9mIEZpZ3VyZSAxMiBzdWdnZXN0cyB0aGF0IHRoZXNlIHVuZGVyLWF0dHJpYnV0aW9ucyBtYXkgaGF2ZSBiZWNvbWUgbGVzcyBkcmFtYXRpYyB3aXRoIGFnZSB3aXRoaW4gdGhlIGNoaWxkIHNhbXBsZSwgcGFydGljdWxhcmx5IGZvciB0aGUgYmVldGxlIChidXQgYWdhaW4sIG91ciByZWdyZXNzaW9uIGFuYWx5ZXMgZGlkIG5vdCByZXZlYWwgc3Vic3RhbnRpYWwgYWdlIGVmZmVjdHMpLiBCZXlvbmQgdGhpcywgY2hpbGRyZW4gIHdlcmUgbGVzcyBsaWtlbHkgdGhhbiBhZHVsdHMgdG8gbWFyayBhIHNoYXJwIGRpc3RpbmN0aW9uIGJldGVlbiAiYW5pbWF0ZXMiIChpbiB0aGlzIGNhc2UsIHRoZSBiZWV0bGUpIGFuZCAiaW5hbmltYXRlcyIgKHRoZSByb2JvdCkgaW4gdGhlIF9NSU5EXyBkb21haW4sIHdoaWNoIGVjaG9lcyB0aGUgc3VycHJpc2luZyBmaW5kaW5nIGluIFN0dWR5IDIgdGhhdCBldmVuIG9sZGVyIGNoaWxkcmVuICg3LTl5KSBmYWlsZWQgdG8gbWFrZSBhZHVsdC1saWtlIGRpc3RpbmN0aW9ucyBiZXR3ZWVuIGFuaW1hdGUgYW5kIGluYW5pbXRlIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZWlyIGF0dHJpYnV0aW9ucyBvZiBfTUlORF8uCgojIEdlbmVyYWwgRGlzY3Vzc2lvbgoKIyMgU3VtbWFyeQoKSW4gdGhyZWUgbGFyZ2Utc2NhbGUgc3R1ZGllcyAodG90YWwgX05fPWByIG5yb3coZDFfNzlfd2lkZSkgKyBucm93KGQyXzc5X3dpZGUpICsgbnJvdyhkMl80Nl93aWRlKSArIG5yb3coZDNfNDZfd2lkZSkvMmAgY2hpbGRyZW4gYW5kIGByIG5yb3coZDFfYWRfd2lkZSkgKyBucm93KGQyX2FkX3dpZGUpICsgbnJvdyhkM19hZF93aWRlKS8yYCBhZHVsdHMpLCB3ZSBzZXQgb3V0IHRvIGV4cG9yZSB0aGUgZGV2ZWxvcG1lbnQgb2YgVVMgY2hpbGRyZW4ncyBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSBiZXR3ZWVuIDQtOXkgb2YgYWdlLiBUaGVzZSBzdHVkaWVzIHN1Z2dlc3QgdGhhdCB0aGVzZSByZXByZXNlbnRhdGlvbnMgdW5kZXJnbyBzdWJzdGFudGlhbCBkZXZlbG9wbWVudCBvdmVyIHRoZSBjb3Vyc2Ugb2YgZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2TigJRpbiB0d28gZGlzdGluY3Qgc2Vuc2VzLiAKCkZpcnN0LCBhbmFseXNlcyBvZiB0aGUgY29ycmVsYXRpb25hbCBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zICh2aWEgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzKSBzdWdnZXN0ZWQgY2hhbmdlcyBpbiBvbnRvbG9naWNhbCBfc3RydWN0dXJlXy4gQmV0d2VlbiBlYXJseSBjaGlsZGhvb2QgKDQtNiB5ZWFyczsgU3R1ZGllcyAyLTMpIGFuZCBtaWRkbGUgY2hpbGRob29kICg3LTkgeWVhcnM7IFN0dWRpZXMgMS0yKSwgY2hpbGRyZW4ncyBzZW5zZSBvZiB3aGljaCBtZW50YWwgY2FwYWNpdGllcyAiZ28gdG9nZXRoZXIiIHNlZW1zIHRvIHVuZm9sZCBpbnRvIGEgaGlnaGVyLWRpbWVuc2lvbmFsIHNwYWNlLCBjaGFyYWN0ZXJpemVkIGJ5IHN0cm9uZ2VyIGRpZmZlcmVudGlhdGlvbiBvZiB0aGUgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgdGhhdCB3ZSd2ZSBjYWxsZWQgX0hFQVJUXyBmcm9tIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIF9CT0RZXyBhbmQgdGhlIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyBvZiB0aGUgX01JTkRfLiAKClNlY29uZCwgYW5hbHlzZXMgb2YgZmFjdG9yIHNjb3Jlc+KAlHN1bW1hcmllcyBvZiB3aGljaCBtZW50YWwgY2FwYWNpdGllcyBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGF0dHJpYnV0ZSB0byB3aGljaCB0YXJnZXQgY2hhcmFjdGVyc+KAlHJldmVhbGVkIGEgc2Vjb25kIGtpbmQgb2YgYWdlLXJlbGF0ZWQgZGlmZmVyZW5jZTogd2hhdCB3ZSBtaWdodCBjYWxsIGNoYW5nZXMgaW4gdGhlIF9hcHBsaWNhdGlvbl8gb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUuIEluIHNvbWUgd2F5cywgdGhlc2UgZGlmZmVyZW5jZXMgd2VyZSBjbGVhcmVzdCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGFuaW1hdGUgYmVpbmdzIGFuZCBpbmFuaW1hdGUgb2JqZWN0czogSW4gdGhlIF9CT0RZXyBkb21haW4sIGFuIGFuaW1hdGUtaW5hbmltYXRlIGRpc3RpbmN0aW9uIHdhcyBjbGVhcmx5IHByZXNlbnQgZXZlbiBhbW9uZyB0aGUgeW91bmdlc3QgY2hpbGRyZW4gaW4gdGhlc2Ugc3R1ZGllcywgYnV0IGl0IGJlY2FtZSBtb3JlIGRyYW1hdGljIHdpdGggYWdl4oCUYXBwYXJlbnRseSBkcml2ZW4gYnkgcmVmaW5lbWVudHMgaW4gY2hpbGRyZW4ncyB1bmRlcnN0YW5kaW5nIG9mIGF0eXBpY2FsIGFuaW1hdGVzLCBzdWNoIGFzIGluc2VjdHMsIGFuZCBhdHlwaWNhbCBpbmFuaW1hdGVzLCBzdWNoIGFzIHJvYm90cyAod2hhdCB3ZSBoYXZlIGNhbGxlZCAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZykuIEluIGJvdGggdGhlIF9NSU5EXyBhbmQgdGhlIF9IRUFSVF8gZG9tYWlucywgaG93ZXZlciwgd2UgYWxzbyBvYnNlcnZlZCBnbG9iYWwgZGlmZmVyZW5jZXMgaW4gY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zLCB3aXRoIGNoaWxkcmVuIHVuZGVyLWF0dHJpYnV0aW5nIF9NSU5EXyBhbmQgb3Zlci1hdHRyaWJ1dGluZyBfSEVBUlRfIChyZWxhdGl2ZSB0byBhZHVsdHMpIGFjcm9zcyB0aGUgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhlc2Ugc3R1ZGllcy4KCioqQk9PS01BUksqKgoKQmVsb3csIHdlIGNvbnNpZGVyIFhYLgoKWFggR0QKCg==